1. Produk
  2.   Imej
  3.   C++
  4.   CImg
 
  

Perpustakaan C++ Sumber Terbuka untuk Pemprosesan Imej

Gunakan Penapis Imej, Cipta, Manipulasi & Paparkan format fail Imej Popular menggunakan API C++ Percuma.

Perpustakaan CImg ialah perpustakaan sumber terbuka yang menyediakan ciri berguna untuk memuatkan, menyimpan, memaparkan dan memproses pelbagai jenis imej dalam aplikasi C++. CImg ialah perpustakaan yang sangat ringan dan mesra pengguna. Perkara yang baik ialah ia mengelakkan pengendalian kebergantungan kompleks dan isu keserasian perpustakaan. Ia diperbuat daripada fail pengepala tunggal CImg.h yang mesti disertakan dalam sumber C++ anda. Ia membantu pembangun dengan melakukan aktiviti pemprosesan imej yang kompleks dalam hanya beberapa baris kod.

API menyokong ciri lanjutan seperti mengendalikan imej 3D, Mengubah imej, penapisan imej, animasi imej, Perduaan Imej dan banyak lagi. Perpustakaan CImg sangat mudah alih & serba lengkap. Ia boleh digunakan dengan mudah pada sistem pengendalian yang berbeza dengan mudah. Selain itu, ia juga sangat serasi dengan banyak pengkompil C++ seperti Visual C++, ICC, G++, dsb.

Previous Next

Bermula dengan CImg

Perpustakaan CImg tersedia sebagai pakej .zip yang tidak bergantung pada platform. Ia mengandungi semua fail yang diperlukan, bersama-sama dengan pelbagai contoh, yang menunjukkan cara menggunakan fungsi dan kelas perpustakaan.

Anda perlu menambah dua baris ini dalam kod sumber C++ anda, untuk dapat berfungsi dengan CImg.

Tambahkan baris ini untuk CImg berfungsi

 #include "CImg.h" 
using namespace cimg_library 

Dapatkan Versi Terkini CImg melalui Git

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

API C++ untuk Mencipta & Mengubah Suai Imej

Pustaka sumber terbuka CImg membolehkan pembangun C++ mencipta dan memanipulasi pelbagai jenis imej dalam aplikasi mereka sendiri. Ia juga menyokong cara mengendalikan paparan imej dan acara tetikus. Pertama sekali, anda perlu memasukkan fail pengepala utama dan satu-satunya perpustakaan CImg. Perkara yang baik ialah perpustakaan mengurangkan beban pembangun dengan membenarkan mereka menulis jumlah kod yang sangat kecil. Sila ambil perhatian juga bahawa sumber akan berfungsi dengan sempurna pada sistem UNIX dan Windows.

Cipta Imej melalui perpustakaan 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;
}

Sokongan Penapisan Imej

Pustaka CImg menyediakan sokongan untuk proses penapisan imej. Kadangkala kita perlu mendapatkan semula maklumat tentang imej dan di situlah penapisan imej biasa digunakan. Proses penapisan imej adalah salah satu kaedah yang paling biasa digunakan pada imej untuk mendapatkan maklumat. Selalunya, penapis digunakan dalam penyingkiran hingar imej, derivatif imej komputer, peningkatan tepi imej, analisis bentuk dan banyak lagi.

Gunakan Penapisan Fourier dalam Apl 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;
}
 Melayu