Open Source C++-bibliotheek voor beeldverwerking
Pas afbeeldingsfilters toe, maak, manipuleer en render populaire afbeeldingen-bestandsindelingen met behulp van de gratis C++ API.
CImg Library is een open source-bibliotheek die handige functies biedt voor het laden, opslaan, weergeven en verwerken van verschillende soorten afbeeldingen in C++-toepassingen. De CImg is een zeer lichtgewicht en gebruiksvriendelijke bibliotheek. Het goede ding is dat het complexe afhankelijkheden en compatibiliteitsproblemen met bibliotheken vermijdt. Het is gemaakt van een enkel headerbestand CImg.h dat moet worden opgenomen in uw C++-bron. Het helpt ontwikkelaars door complexe beeldverwerkingsactiviteiten uit te voeren in slechts een paar regels code.
De API ondersteunt geavanceerde functies zoals het verwerken van 3D-beelden, het transformeren van afbeeldingen, beeldfiltering, beeldanimatie, beeldbinarisatie en meer. CImg-bibliotheek is zeer draagbaar en op zichzelf staand. Het kan gemakkelijk worden gebruikt op verschillende besturingssystemen met gemak. Bovendien is het ook zeer compatibel met talloze C++-compilers zoals Visual C++, ICC, G++, enz.
Aan de slag met CImg
De CImg-bibliotheek is beschikbaar als .zip-pakket dat platformonafhankelijk is. Het bevat alle vereiste bestanden, samen met verschillende voorbeelden, die laten zien hoe de bibliotheekfuncties en klassen moeten worden gebruikt.
U moet deze twee regels in uw C++-broncode toevoegen om met CImg te kunnen werken.
Voeg deze regels toe om CImg te laten werken
#include "CImg.h"
using namespace cimg_library
Haal de Latest Version van CImg via Git
git clone --depth=1 https://github.com/GreycLab/CImg.git
C++ API om afbeeldingen te maken en te wijzigen
Met de open-sourcebibliotheek van CImg kunnen C++-ontwikkelaars verschillende soorten afbeeldingen in hun eigen toepassingen maken en manipuleren. Het ondersteunt ook hoe om te gaan met beeldweergave en muisgebeurtenissen. Allereerst moet u de hoofd- en enige headerbestanden van de CImg-bibliotheek opnemen. Het goede ding is dat de bibliotheek de belasting van de ontwikkelaar vermindert door ze een zeer kleine hoeveelheid code te laten schrijven. Houd er ook rekening mee dat de broncode perfect werkt op UNIX- en Windows-systemen.
Creëer Image via C++ bibliotheek
#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;
}
Ondersteuning voor beeldfiltering
De CImg-bibliotheek biedt ondersteuning voor het beeldfilterproces. Soms moeten we informatie over afbeeldingen ophalen en dat is waar afbeeldingsfiltering vaak wordt gebruikt. Het beeldfilterproces is een van de meest gebruikelijke methoden om op afbeeldingen toe te passen om informatie op te halen. Meestal worden filters gebruikt bij het verwijderen van beeldruis, computerbeeldderivaten, beeldrandverbetering, vormanalyse en meer.
Apply Courier Filtering in C++ App
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;
}