Bibliotecă C++ open source pentru procesarea imaginilor
Aplicați filtre de imagine, creați, manipulați și randați formate de fișiere de imagini populare folosind API-ul C++ gratuit.
CImg Library este o bibliotecă open source care oferă caracteristici utile pentru încărcarea, salvarea, afișarea și procesarea diferitelor tipuri de imagini în aplicațiile C++. CImg este o bibliotecă foarte ușoară și ușor de utilizat. Lucrul bun este că evită gestionarea dependențelor complexe și a problemelor de compatibilitate cu bibliotecile. Este format dintr-un singur fișier antet CImg.h care trebuie inclus în sursa dvs. C++. Ajută dezvoltatorii realizând activități complexe de procesare a imaginii în doar câteva linii de cod.
API-ul acceptă funcții avansate, cum ar fi gestionarea imaginilor 3D, transformarea imaginilor, filtrarea imaginilor, animația imaginii, binarizarea imaginilor și multe altele. Biblioteca CImg este foarte portabilă și autonomă. Poate fi folosit cu ușurință pe diferite sisteme de operare. În plus, este, de asemenea, foarte compatibil cu numeroasele compilatoare C++, cum ar fi Visual C++, ICC, G++ etc.
Noțiuni introductive cu CImg
Biblioteca CImg este disponibilă ca pachet .zip, care este independent de platformă. Conține toate fișierele necesare, împreună cu diverse exemple, care arată cum să utilizați funcțiile și clasele bibliotecii.
Trebuie să adăugați aceste două linii în codul sursă C++, pentru a putea lucra cu CImg.
Adăugați aceste rânduri pentru a funcționa CImg
#include "CImg.h"
using namespace cimg_library
Obțineți cea mai recentă versiune de CImg prin Git
git clone --depth=1 https://github.com/GreycLab/CImg.git
API C++ pentru a crea și a modifica imagini
Biblioteca CImg open-source permite dezvoltatorilor C++ să creeze și să manipuleze diferite tipuri de imagini în propriile aplicații. De asemenea, acceptă modul în care se gestionează afișarea imaginilor și evenimentele mouse-ului. În primul rând, trebuie să includeți fișierele principale și singurele antet ale bibliotecii CImg. Lucrul bun este că biblioteca reduce sarcina dezvoltatorului, permițându-le să scrie o cantitate foarte mică de cod. Vă rugăm să rețineți că sursa va funcționa perfect pe sistemele UNIX și Windows.
Creați imagine prin biblioteca 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;
}
Suport pentru filtrarea imaginilor
Biblioteca CImg oferă suport pentru procesul de filtrare a imaginii. Uneori trebuie să recuperăm informații despre imagini și aici este folosită în mod obișnuit filtrarea imaginilor. Procesul de filtrare a imaginilor este una dintre cele mai comune metode de aplicat imaginilor pentru a prelua informații. În cea mai mare parte, filtrele sunt utilizate în eliminarea zgomotului de imagine, derivate ale imaginii computerizate, îmbunătățirea marginilor imaginii, analiza formei și multe altele.
Aplicați filtrarea Fourier în aplicațiile 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;
}