Open Source C++ bibliotek för bildbehandling
Använd bildfilter, skapa, manipulera och rendera filformat för populära bilder med gratis C++ API.
CImg Library är ett bibliotek med öppen källkod som ger användbara funktioner för att ladda, spara, visa och bearbeta olika typer av bilder i C++-applikationer. CImg är ett mycket lätt och användarvänligt bibliotek. Det som är bra är att det undviker att hantera komplexa beroenden och problem med bibliotekskompatibilitet. Den är gjord av en enda huvudfil CImg.h som måste inkluderas i din C++-källa. Det hjälper utvecklare genom att utföra komplexa bildbehandlingsaktiviteter på bara några rader kod.
API:et stöder avancerade funktioner som hantering av 3D-bilder, transformering av bilder, bildfiltrering, bildanimering, bildbinarisering och mer. CImg-biblioteket är mycket bärbart och fristående. Det är lätt att använda på olika operativsystem med lätthet. Dessutom är den också mycket kompatibel med många C++-kompilatorer som Visual C++, ICC, G++, etc.
Komma igång med CImg
CImg Library är tillgängligt som .zip-paket som är plattformsoberoende. Den innehåller alla nödvändiga filer, tillsammans med olika exempel, som visar hur man använder bibliotekets funktioner och klasser.
Du måste lägga till dessa två rader i din C++ källkod, för att kunna arbeta med CImg.
Lägg till dessa rader för att CImg ska fungera
#include "CImg.h"
using namespace cimg_library
Få den senaste versionen av CImg via Git
git clone --depth=1 https://github.com/GreycLab/CImg.git
C++ API för att skapa och ändra bilder
CImg open source-bibliotek låter C++-utvecklare skapa och manipulera olika typer av bilder i sina egna applikationer. Den stöder också hur man hanterar bildvisning och mushändelser. Först och främst måste du inkludera huvudfilerna och de enda rubrikfilerna i CImg-biblioteket. Det som är bra är att biblioteket minskar utvecklarens belastning genom att tillåta dem att skriva en mycket liten mängd kod. Observera också att källan fungerar perfekt på UNIX- och Windows-system.
Skapa bild via C++-biblioteket
#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;
}
Stöd för bildfiltrering
CImg-biblioteket ger stöd för bildfiltreringsprocessen. Ibland behöver vi hämta information om bilder och det är där bildfiltrering vanligtvis används. Bildfiltreringsprocessen är en av de vanligaste metoderna att tillämpa på bilder för att hämta information. För det mesta används filter vid borttagning av bildbrus, datorbildderivat, bildkantsförbättring, formanalys och mer.
Använd Fourier-filtrering i C++-appar
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;
}