Open Source C++ bibliotek til billedbehandling
Anvend billedfiltre, opret, manipuler og gengiv populære billedfilformater ved hjælp af gratis C++ API.
CImg Library er et open source-bibliotek, der giver nyttige funktioner til indlæsning, lagring, visning og behandling af forskellige typer billeder i C++-applikationer. CImg er et meget let og brugervenligt bibliotek. Det gode er, at det undgår at håndtere komplekse afhængigheder og problemer med bibliotekskompatibilitet. Den er lavet af en enkelt header-fil CImg.h, der skal inkluderes i din C++-kilde. Det hjælper udviklere ved at udføre komplekse billedbehandlingsaktiviteter på blot et par linjer kode.
API'en understøtter avancerede funktioner som håndtering af 3D-billeder, transformation af billeder, billedfiltrering, billedanimation, billedbinarisering og mere. CImg-biblioteket er meget bærbart og selvstændigt. Det kan nemt bruges på forskellige operativsystemer med lethed. Desuden er den også meget kompatibel med adskillige C++-kompilere såsom Visual C++, ICC, G++ osv.
Kom godt i gang med CImg
CImg-biblioteket er tilgængeligt som .zip-pakke, som er platformsuafhængig. Den indeholder alle de nødvendige filer, sammen med forskellige eksempler, som viser, hvordan man bruger bibliotekets funktioner og klasser.
Du skal tilføje disse to linjer i din C++ kildekode, for at kunne arbejde med CImg.
Tilføj disse linjer for at CImg fungerer
#include "CImg.h"
using namespace cimg_library
Få den seneste version af CImg via Git
git clone --depth=1 https://github.com/GreycLab/CImg.git
C++ API til at oprette og ændre billeder
CImg open source-bibliotek giver C++-udviklere mulighed for at skabe og manipulere forskellige typer billeder i deres egne applikationer. Det understøtter også, hvordan man håndterer billedvisning og musehændelser. Først og fremmest skal du inkludere hoved- og eneste header-filer i CImg-biblioteket. Det gode er, at biblioteket reducerer udviklerens belastning ved at tillade dem at skrive en meget lille mængde kode. Bemærk også, at kilden fungerer perfekt på UNIX- og Windows-systemer.
Opret billede via C++ bibliotek
#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;
}
Understøttelse af billedfiltrering
CImg-biblioteket understøtter billedfiltreringsprocessen. Nogle gange har vi brug for at hente information om billeder, og det er her, billedfiltrering almindeligvis bruges. Billedfiltreringsprocessen er en af de mest almindelige metoder til at anvende på billeder for at hente information. For det meste bruges filtre til fjernelse af billedstøj, computerbilledderivater, billedkantforbedring, formanalyse og mere.
Anvend Fourier-filtrering i C++-apps
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;
}