Бібліотека C++ з відкритим кодом для обробки зображень

Застосовуйте фільтри зображень, створюйте, маніпулюйте та візуалізуйте популярні формати файлів зображень за допомогою безкоштовного C++ API.

Бібліотека CImg — це бібліотека з відкритим кодом, яка надає корисні функції для завантаження, збереження, відображення та обробки різних типів зображень у програмах C++. CImg — це дуже легка та зручна бібліотека. Добре те, що він уникає обробки складних залежностей і проблем із сумісністю бібліотек. Він складається з єдиного файлу заголовка CImg.h, який має бути включений у вихідний код C++. Він допомагає розробникам, виконуючи складні дії з обробки зображень лише за кілька рядків коду.

API підтримує розширені функції, такі як обробка 3D-зображень, трансформація зображень, фільтрація зображень, анімація зображень, бінаризація зображень тощо. Бібліотека CImg дуже портативна та автономна. Його можна легко використовувати в різних операційних системах. Крім того, він також дуже сумісний із численними компіляторами C++, такими як Visual C++, ICC, G++ тощо.

Previous Next

Початок роботи з CImg

Бібліотека CImg доступна як пакет .zip, який не залежить від платформи. Він містить усі необхідні файли разом із різноманітними прикладами, які показують, як використовувати бібліотечні функції та класи.

Вам потрібно додати ці два рядки у вихідний код C++, щоб мати можливість працювати з CImg.

Додайте ці рядки для роботи CImg

 #include "CImg.h" 
using namespace cimg_library 

Отримайте останню версію CImg через Git

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

C++ API для створення та зміни зображень

Бібліотека з відкритим вихідним кодом CImg дозволяє розробникам C++ створювати різні типи зображень у своїх власних програмах і керувати ними. Він також підтримує, як обробляти відображення зображення та події миші. Перш за все, вам потрібно включити основні та єдині файли заголовків бібліотеки CImg. Добре те, що бібліотека зменшує навантаження на розробників, дозволяючи їм писати дуже невелику кількість коду. Зверніть також увагу, що вихідний код ідеально працюватиме в системах UNIX і Windows.

Створення зображення за допомогою бібліотеки 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;
}

Підтримка фільтрації зображень

Бібліотека CImg підтримує процес фільтрації зображень. Іноді нам потрібно отримати інформацію про зображення, і саме тут зазвичай використовується фільтрація зображень. Процес фільтрації зображень є одним із найпоширеніших методів, які застосовуються до зображень для отримання інформації. Здебільшого фільтри використовуються для видалення шуму зображення, похідних комп’ютерних зображень, покращення країв зображення, аналізу форми тощо.

Застосуйте фільтрацію Фур’є в програмах 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;
}
 Українська