C++ библиотека с отворен код за обработка на изображения
Прилагайте филтри за изображения, създавайте, манипулирайте и изобразявайте популярни файлови формати за изображения с помощта на безплатен C++ API.
CImg Library е библиотека с отворен код, която предоставя полезни функции за зареждане, запазване, показване и обработка на различни видове изображения в C++ приложения. CImg е много лека и лесна за използване библиотека. Хубавото е, че избягва обработката на сложни зависимости и проблеми със съвместимостта на библиотеката. Той се състои от един заглавен файл CImg.h, който трябва да бъде включен във вашия C++ източник. Той помага на разработчиците, като извършва сложни дейности по обработка на изображения само с няколко реда код.
API поддържа разширени функции като работа с 3D изображения, трансформиране на изображения, филтриране на изображения, анимация на изображения, бинаризация на изображения и други. CImg библиотеката е много преносима и самостоятелна. Може лесно да се използва на различни операционни системи с лекота. Освен това, той също е много съвместим с множество C++ компилатори като Visual C++, ICC, G++ и др.
Първи стъпки с CImg
Библиотеката CImg се предлага като .zip пакет, който е независим от платформата. Той съдържа всички необходими файлове, заедно с различни примери, които показват как да използвате библиотечните функции и класове.
Трябва да добавите тези два реда във вашия изходен код на C++, за да можете да работите с CImg.
Добавете тези редове, за да CImg работи
#include "CImg.h"
using namespace cimg_library
Вземете най-новата версия на CImg чрез Git
git clone --depth=1 https://github.com/GreycLab/CImg.git
C++ API за създаване и промяна на изображения
Библиотеката с отворен код CImg позволява на C++ разработчиците да създават и манипулират различни типове изображения в собствените си приложения. Той също така поддържа как да обработвате показване на изображение и събития на мишката. На първо място, трябва да включите основните и единствени заглавни файлове на библиотеката CImg. Хубавото е, че библиотеката намалява натоварването на разработчиците, като им позволява да пишат много малко количество код. Моля, имайте предвид също, че източникът ще работи идеално на UNIX и Windows системи.
Създайте изображение чрез 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;
}
Поддръжка за филтриране на изображения
Библиотеката CImg осигурява поддръжка за процеса на филтриране на изображения. Понякога трябва да извлечем информация за изображения и това е мястото, където обикновено се използва филтрирането на изображения. Процесът на филтриране на изображения е един от най-разпространените методи за прилагане към изображения за извличане на информация. Най-вече филтрите се използват за премахване на шума в изображението, производни на компютърно изображение, подобряване на ръба на изображението, анализ на формата и др.
Прилагане на филтриране на Фурие в 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;
}