کتابخانه C++ منبع باز برای پردازش تصویر
اعمال فیلترهای تصویر، ایجاد، دستکاری و رندر فرمت های فایل تصاویر محبوب با استفاده از C++ API رایگان.
CImg Library یک کتابخانه متن باز است که ویژگی های مفیدی را برای بارگیری، ذخیره، نمایش و پردازش انواع مختلف تصاویر در داخل برنامه های ++C ارائه می کند. CImg یک کتابخانه بسیار سبک و کاربرپسند است. نکته خوب این است که از رسیدگی به وابستگی های پیچیده و مسائل مربوط به سازگاری کتابخانه جلوگیری می کند. این از یک فایل هدر CImg.h ساخته شده است که باید در منبع C++ شما گنجانده شود. این برنامه با انجام فعالیت های پیچیده پردازش تصویر تنها در چند خط کد به توسعه دهندگان کمک می کند.
API از ویژگی های پیشرفته ای مانند مدیریت تصاویر سه بعدی، تبدیل تصاویر، فیلتر کردن تصویر، انیمیشن تصویر، باینری سازی تصویر و موارد دیگر پشتیبانی می کند. کتابخانه CImg بسیار قابل حمل و مستقل است. به راحتی می توان از آن بر روی سیستم عامل های مختلف استفاده کرد. علاوه بر این، با تعداد کامپایلرهای C++ مانند Visual C++، ICC، G++ و غیره نیز بسیار سازگار است.
شروع کار با CImg
کتابخانه CImg به صورت بسته .zip در دسترس است که مستقل از پلتفرم است. این شامل تمام فایل های مورد نیاز به همراه مثال های مختلف است که نحوه استفاده از توابع و کلاس های کتابخانه را نشان می دهد.
برای اینکه بتوانید با CImg کار کنید باید این دو خط را در کد منبع ++C خود اضافه کنید.
این خطوط را برای کارکردن 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 را وارد کنید. نکته خوب این است که کتابخانه با اجازه دادن به آنها برای نوشتن مقدار بسیار کمی کد، بار توسعه دهنده را کاهش می دهد. لطفاً همچنین توجه داشته باشید که منبع کاملاً روی سیستم های یونیکس و ویندوز کار می کند.
ایجاد تصویر از طریق کتابخانه ++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;
}