1. Produkty
  2.   Obraz
  3.   C++
  4.   CImg
 
  

Biblioteka Open Source C++ do przetwarzania obrazów

Zastosuj filtry obrazów, twórz, manipuluj i renderuj popularne formaty plików obrazów za pomocą interfejsu API Free C++.

CImg Library to biblioteka typu open source, która zapewnia przydatne funkcje do ładowania, zapisywania, wyświetlania i przetwarzania różnych typów obrazów w aplikacjach C++. CImg to bardzo lekka i przyjazna dla użytkownika biblioteka. Dobrą rzeczą jest to, że pozwala uniknąć obsługi złożonych zależności i problemów ze zgodnością bibliotek. Składa się z pojedynczego pliku nagłówkowego CImg.h, który musi być zawarty w źródle C++. Pomaga programistom, wykonując złożone czynności przetwarzania obrazu w zaledwie kilku linijkach kodu.

Interfejs API obsługuje zaawansowane funkcje, takie jak obsługa obrazów 3D, przekształcanie obrazów, filtrowanie obrazów, animacja obrazu, Binaryzacja obrazu i inne. Biblioteka CImg jest bardzo przenośna i samodzielna. Można go z łatwością używać w różnych systemach operacyjnych. Co więcej, jest również bardzo kompatybilny z licznymi kompilatorami C++, takimi jak Visual C++, ICC, G++ itp.

Previous Next

Pierwsze kroki z CImg

Biblioteka CImg jest dostępna jako pakiet .zip, który jest niezależny od platformy. Zawiera wszystkie wymagane pliki wraz z różnymi przykładami, które pokazują, jak korzystać z funkcji i klas biblioteki.

Musisz dodać te dwie linie w swoim kodzie źródłowym C++, aby móc pracować z CImg.

Dodaj te wiersze, aby działać CImg

 #include "CImg.h" 
using namespace cimg_library 

Pobierz najnowszą wersję CImg przez Git

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

C++ API do tworzenia i modyfikowania obrazów

Biblioteka CImg o otwartym kodzie źródłowym umożliwia programistom C++ tworzenie i manipulowanie różnymi typami obrazów w ich własnych aplikacjach. Obsługuje również sposób obsługi zdarzeń wyświetlania obrazu i myszy. Przede wszystkim musisz dołączyć główne i jedyne pliki nagłówkowe biblioteki CImg. Dobrą rzeczą jest to, że biblioteka zmniejsza obciążenie programistów, pozwalając im na napisanie bardzo małej ilości kodu. Należy również pamiętać, że źródło będzie doskonale działać na systemach UNIX i Windows.

Utwórz obraz za pomocą biblioteki 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;
}

Obsługa filtrowania obrazu

Biblioteka CImg zapewnia obsługę procesu filtrowania obrazów. Czasami musimy pobrać informacje o obrazach i właśnie tam często stosuje się filtrowanie obrazów. Proces filtrowania obrazów jest jedną z najczęstszych metod stosowanych do obrazów w celu uzyskania informacji. Przeważnie filtry są używane w usuwaniu szumów obrazu, pochodnych obrazów komputerowych, ulepszaniu krawędzi obrazu, analizie kształtu i innych.

Zastosuj filtrowanie Fouriera w aplikacjach 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;
}
 Polski