Avoimen lähdekoodin C++-kirjasto kuvankäsittelyä varten
Käytä kuvasuodattimia, luo, manipuloi ja renderöi suosittujen kuvien tiedostomuotoja ilmaisella C++ API:lla.
CImg Library on avoimen lähdekoodin kirjasto, joka tarjoaa hyödyllisiä ominaisuuksia erilaisten kuvien lataamiseen, tallentamiseen, näyttämiseen ja käsittelyyn C++-sovelluksissa. CImg on erittäin kevyt ja käyttäjäystävällinen kirjasto. Hyvä asia on, että se välttää monimutkaisten riippuvuuksien ja kirjastojen yhteensopivuusongelmien käsittelyn. Se koostuu yhdestä otsikkotiedostosta CImg.h, joka on sisällytettävä C++-lähteeseen. Se auttaa kehittäjiä suorittamalla monimutkaisia kuvankäsittelytoimintoja vain muutamalla koodirivillä.
API tukee edistyneitä ominaisuuksia, kuten 3D-kuvien käsittelyä, kuvien muuntamista, kuvien suodatusta, kuvaanimaatiota, kuvan binarisointia ja paljon muuta. CImg-kirjasto on erittäin kannettava ja itsenäinen. Sitä voidaan helposti käyttää eri käyttöjärjestelmissä helposti. Lisäksi se on erittäin yhteensopiva lukuisten C++-kääntäjien, kuten Visual C++, ICC, G++ jne., kanssa.
CImg:n käytön aloittaminen
CImg-kirjasto on saatavana .zip-pakettina, joka on alustasta riippumaton. Se sisältää kaikki tarvittavat tiedostot sekä erilaisia esimerkkejä, jotka osoittavat kuinka kirjaston toimintoja ja luokkia käytetään.
Sinun on lisättävä nämä kaksi riviä C++-lähdekoodiisi, jotta voit työskennellä CImg:n kanssa.
Lisää nämä rivit, jotta CImg toimii
#include "CImg.h"
using namespace cimg_library
Hanki uusin CImg-versio Gitin kautta
git clone --depth=1 https://github.com/GreycLab/CImg.git
C++ API kuvien luomiseen ja muokkaamiseen
CImg avoimen lähdekoodin kirjaston avulla C++-kehittäjät voivat luoda ja käsitellä erityyppisiä kuvia omissa sovelluksissaan. Se tukee myös kuvan näyttö- ja hiiritapahtumien käsittelyä. Ensinnäkin sinun on sisällytettävä CImg-kirjaston pää- ja ainoat otsikkotiedostot. Hyvä asia on, että kirjasto vähentää kehittäjän kuormitusta sallimalla heidän kirjoittaa hyvin pienen määrän koodia. Huomaa myös, että lähde toimii täydellisesti UNIX- ja Windows-järjestelmissä.
Luo kuva C++-kirjaston kautta
#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;
}
Kuvansuodatustuki
CImg-kirjasto tukee kuvien suodatusprosessia. Joskus meidän on haettava tietoja kuvista, ja siellä käytetään yleisesti kuvasuodatusta. Kuvan suodatusprosessi on yksi yleisimmistä menetelmistä, joita käytetään kuviin tiedon hakemiseen. Useimmiten suodattimia käytetään kuvan kohinan poistoon, tietokonekuvan johdannaisiin, kuvan reunan parantamiseen, muoto-analyysiin ja muihin.
Käytä Fourier-suodatusta C++-sovelluksissa
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;
}