Open-Source-C++-Bibliothek für die Bildverarbeitung
Wenden Sie Bildfilter an, erstellen, bearbeiten und rendern Sie beliebte Bilddateiformate mit der kostenlosen C++-API.
CImg Library ist eine Open Source Bibliothek, die nützliche Funktionen zum Laden, Speichern, Anzeigen und Verarbeiten von verschiedenen Arten von Bildern in C++ Anwendungen bietet. Die CImg ist eine sehr leichte und benutzerfreundliche Bibliothek. Das Gute daran ist, dass es die Behandlung komplexer Abhängigkeiten und Probleme der Bibliothekskompatibilität vermeidet. Es besteht aus einer einzigen Header-Datei CImg.h, die in Ihrem C++ Quellcode enthalten sein muss. Es hilft Entwicklern, indem es komplexe Bildbearbeitungsaktivitäten in wenigen Codezeilen durchführt.
Die API unterstützt erweiterte Funktionen wie das Handling von 3D-Bildern, das Transformieren von Bildern, Bildfilterung, Bildanimation, Bildbinarisierung und vieles mehr. CImg Bibliotheken sind sehr portabel und in sich geschlossen. Er ist auf verschiedenen Betriebssystemen leicht einsetzbar. Darüber hinaus ist es auch sehr kompatibel mit wenigerem>numerischen C++ Compilern, wie z.B. kleiner/em>Visual C++, CC, G++ usw.
Erste Schritte mit CImg
Die CImg Bibliothek ist als .zip-Paket verfügbar, das plattformunabhängig ist. Es enthält alle benötigten Dateien zusammen mit verschiedenen Beispielen, die zeigen, wie man die Bibliotheksfunktionen und -klassen benutzt.
Sie müssen diese beiden Zeilen in Ihren C++-Quellcode einfügen, um mit CImg arbeiten zu können.
Fügen Sie diese Zeilen hinzu, damit CImg funktioniert
#include "CImg.h"
using namespace cimg_library
Holen Sie sich die neueste Version von CImg über Git.
git clone --depth=1 https://github.com/GreycLab/CImg.git
C++-API zum Erstellen und Ändern von Bildern
Die Open-Source-Bibliothek CImg ermöglicht es C++-Entwicklern, verschiedene Arten von Bildern in ihren eigenen Anwendungen zu erstellen und zu bearbeiten. Es unterstützt auch die Behandlung von Bildanzeige- und Mausereignissen. Zunächst müssen Sie die wichtigsten und einzigen Header-Dateien der CImg-Bibliothek einbinden. Das Gute ist, dass die Bibliothek die Belastung des Entwicklers reduziert, indem sie ihm erlaubt, eine sehr kleine Menge Code zu schreiben. Bitte beachten Sie auch, dass die Quelle perfekt auf UNIX- und Windows-Systemen funktioniert.
Bild erstellen via C++ Bibliothek
#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;
}
Unterstützung der Bildfilterung
CImg Bibliotheken unterstützen den Bildfilterprozess. Manchmal müssen wir Informationen über Bilder abrufen und dort wird Image-Filterung häufig verwendet. Der Bildfilterprozess ist eine der häufigsten Methoden, die für Bilder angewendet werden, um Informationen abzurufen. Meistens werden Filter für die Entfernung von Bildrauschen, Computerbildderivaten, Bild Kantenverbesserungen, Shape Analyse und vieles mehr verwendet.
Kurierfilter in C++ Apps anwenden
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;
}