1. Produkti
  2.   Attēls
  3.   C++
  4.   CImg
 
  

Atvērtā pirmkoda C++ bibliotēka attēlu apstrādei

Izmantojiet attēlu filtrus, izveidojiet, manipulējiet un renderējiet populāru attēlu failu formātus, izmantojot bezmaksas C++ API.

CImg bibliotēka ir atvērtā pirmkoda bibliotēka, kas nodrošina noderīgas funkcijas dažāda veida attēlu ielādei, saglabāšanai, parādīšanai un apstrādei C++ lietojumprogrammās. CImg ir ļoti viegla un lietotājam draudzīga bibliotēka. Labā lieta ir tā, ka tas ļauj izvairīties no sarežģītu atkarību un bibliotēku saderības problēmu risināšanas. Tas ir izveidots no viena galvenes faila CImg.h, kas jāiekļauj jūsu C++ avotā. Tas palīdz izstrādātājiem, veicot sarežģītas attēlu apstrādes darbības tikai dažās koda rindās.

API atbalsta uzlabotas funkcijas, piemēram, 3D attēlu apstrādi, attēlu pārveidošanu, attēlu filtrēšanu, attēlu animāciju, attēlu binarizāciju un citas. CImg bibliotēka ir ļoti pārnēsājama un autonoma. To var viegli izmantot dažādās operētājsistēmās. Turklāt tas ir ļoti saderīgs arī ar daudziem C++ kompilatoriem, piemēram, Visual C++, ICC, G++ utt.

Previous Next

Darba sākšana ar CImg

CImg bibliotēka ir pieejama kā .zip pakotne, kas ir neatkarīga no platformas. Tajā ir visi nepieciešamie faili, kā arī dažādi piemēri, kas parāda, kā izmantot bibliotēkas funkcijas un klases.

Lai varētu strādāt ar CImg, C++ avota kodā ir jāpievieno šīs divas rindiņas.

Pievienojiet šīs rindiņas, lai CImg darbotos

 #include "CImg.h" 
using namespace cimg_library 

Iegūstiet jaunāko CImg versiju, izmantojot Git

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

C++ API attēlu izveidei un modificēšanai

CImg atvērtā koda bibliotēka ļauj C++ izstrādātājiem izveidot un manipulēt ar dažāda veida attēliem savās lietojumprogrammās. Tas arī atbalsta to, kā rīkoties ar attēlu displeju un peles notikumiem. Pirmkārt, jums jāiekļauj galvenie un vienīgie CImg bibliotēkas galvenes faili. Labā lieta ir tāda, ka bibliotēka samazina izstrādātāja slodzi, ļaujot viņiem rakstīt ļoti mazu koda daudzumu. Lūdzu, ņemiet vērā arī to, ka avots lieliski darbosies UNIX un Windows sistēmās.

Izveidojiet attēlu, izmantojot C++ bibliotēku

 #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;
}

Attēlu filtrēšanas atbalsts

CImg bibliotēka nodrošina atbalstu attēlu filtrēšanas procesam. Dažreiz mums ir jāizgūst informācija par attēliem, un tieši tur parasti tiek izmantota attēlu filtrēšana. Attēlu filtrēšanas process ir viena no visizplatītākajām metodēm, ko attēliem izmanto informācijas izgūšanai. Pārsvarā filtri tiek izmantoti attēla trokšņu noņemšanai, datora attēlu atvasinājumiem, attēla malu uzlabošanai, formu analīzi un citiem.

Izmantojiet Furjē filtrēšanu programmā 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;
}
 Latviski