1. produkty
  2.   obraz
  3.   C++
  4.   CImg
 
  

Open Source C++ knihovna pro zpracování obrazu

Aplikujte obrazové filtry, vytvářejte, manipulujte a vykreslujte oblíbené formáty souborů pomocí bezplatného C++ API.

CImg Library je knihovna s otevřeným zdrojovým kódem, která poskytuje užitečné funkce pro načítání, ukládání, zobrazování a zpracování různých typů obrázků v aplikacích C++. CImg je velmi lehká a uživatelsky přívětivá knihovna. Dobrá věc je, že se vyhne složitým závislostem a problémům s kompatibilitou knihoven. Je tvořen jediným hlavičkovým souborem CImg.h, který musí být součástí vašeho zdrojového kódu C++. Pomáhá vývojářům prováděním složitých činností zpracování obrazu v několika řádcích kódu.

API podporuje pokročilé funkce, jako je zpracování 3D obrázků, transformace obrázků, filtrování obrázků, animace obrázků, binarizace obrázků a další. Knihovna CImg je velmi přenosná a samostatná. Lze jej snadno používat na různých operačních systémech. Navíc je také velmi kompatibilní s četnými kompilátory C++, jako je Visual C++, ICC, G++ atd.

Previous Next

Začínáme s CImg

Knihovna CImg je dostupná jako balíček .zip, který je nezávislý na platformě. Obsahuje všechny požadované soubory spolu s různými příklady, které ukazují, jak používat funkce knihovny a třídy.

Tyto dva řádky musíte přidat do zdrojového kódu C++, abyste mohli pracovat s CImg.

Přidejte tyto řádky, aby CImg fungoval

 #include "CImg.h" 
using namespace cimg_library 

Získejte nejnovější verzi CImg přes Git

git clone --depth=1 https://github.com/GreycLab/CImg.git

C++ API pro vytváření a úpravu obrázků

CImg open-source knihovna umožňuje vývojářům C++ vytvářet a manipulovat s různými typy obrázků v rámci jejich vlastních aplikací. Podporuje také, jak zacházet se zobrazením obrázků a událostmi myši. Nejprve musíte zahrnout hlavní a jediné hlavičkové soubory knihovny CImg. Dobrá věc je, že knihovna snižuje zatížení vývojářů tím, že jim umožňuje psát velmi malé množství kódu. Upozorňujeme také, že zdroj bude perfektně fungovat na systémech UNIX a Windows.

Vytvořte obrázek pomocí knihovny C++

 #include "CImg.h"
using namespace cimg_library;
int main() {
  CImg image("lena.jpg"), visu(500,400,1,3,0);
  const unsigned char red[] = { 255,0,0 }, green[] = { 0,255,0 }, blue[] = { 0,0,255 };
  image.blur(2.5);
  CImgDisplay main_disp(image,"Click a point"), draw_disp(visu,"Intensity profile");
  while (!main_disp.is_closed() && !draw_disp.is_closed()) {
    main_disp.wait();
    if (main_disp.button() && main_disp.mouse_y()>=0) {
      const int y = main_disp.mouse_y();
      visu.fill(0).draw_graph(image.get_crop(0,y,0,0,image.width()-1,y,0,0),red,1,1,0,255,0);
      visu.draw_graph(image.get_crop(0,y,0,1,image.width()-1,y,0,1),green,1,1,0,255,0);
      visu.draw_graph(image.get_crop(0,y,0,2,image.width()-1,y,0,2),blue,1,1,0,255,0).display(draw_disp);
      }
    }
  return 0;
}

Podpora filtrování obrázků

Knihovna CImg poskytuje podporu pro proces filtrování obrázků. Někdy potřebujeme získat informace o obrázcích a tam se běžně používá filtrování obrázků. Proces filtrování obrázků je jednou z nejběžnějších metod, které se používají na obrázky za účelem získání informací. Většinou se filtry používají při odstraňování obrazového šumu, počítačových derivátů obrazu, vylepšení okrajů obrazu, tvarové analýzy a dalších.

Aplikujte Fourierovu filtraci v aplikacích C++

 void* item_fourier_filtering() {
  const CImg img = CImg(data_milla,211,242,1,3).RGBtoYCbCr().channel(0).resize(256,256);
  CImgList F = img.get_FFT();
  cimglist_apply(F,shift)(img.width()/2,img.height()/2,0,0,2);
  const CImg mag = ((F[0].get_pow(2) + F[1].get_pow(2)).sqrt() + 1).log().normalize(0,255);
  CImgList visu(img,mag);
  CImgDisplay disp(visu,"[#16] - Fourier Filtering (Click to set filter)");
  CImg mask(img.width(),img.height(),1,1,1);
  const unsigned char one[] = { 1 }, zero[] = { 0 }, white[] = { 255 };
  int rmin = 0, rmax = 256;
  while (!disp.is_closed() && !disp.is_keyQ() && !disp.is_keyESC()) {
    disp.wait();
    const int
      xm = disp.mouse_x()*2*img.width()/disp.width() - img.width(),
      ym = disp.mouse_y()*img.height()/disp.height(),
      x = xm - img.width()/2,
      y = ym - img.height()/2;
    if (disp.button() && xm>=0 && ym>=0) {
      const int r = (int)std::max(0.0f,(float)std::sqrt((float)x*x + y*y) - 3);
      if (disp.button()&1) rmax = r;
      if (disp.button()&2) rmin = r;
      if (rmin>=rmax) rmin = std::max(rmax - 1,0);
      mask.fill(0).draw_circle(mag.width()/2,mag.height()/2,rmax,one).
        draw_circle(mag.width()/2,mag.height()/2,rmin,zero);
      CImgList nF(F);
      cimglist_for(F,l) nF[l].mul(mask).shift(-img.width()/2,-img.height()/2,0,0,2);
      visu[0] = nF.FFT(true)[0].normalize(0,255);
    }
    if (disp.is_resized()) disp.resize(disp.window_width(),disp.window_width()/2).display(visu);
    visu[1] = mag.get_mul(mask).draw_text(5,5,"Freq Min/Max = %d / %d",white,zero,0.6f,13,(int)rmin,(int)rmax);
    visu.display(disp);
  }
  return 0;
}
 Čeština