इमेज प्रोसेसिंग के लिए ओपन सोर्स सी++ लाइब्रेरी
मुफ्त C++ API का उपयोग करके छवि फ़िल्टर लागू करें, बनाएं, हेरफेर करें और लोकप्रिय छवियाँ फ़ाइल स्वरूपों को प्रस्तुत करें।
CImg लाइब्रेरी एक ओपन सोर्स लाइब्रेरी है जो C ++ एप्लिकेशन के अंदर विभिन्न प्रकार की छवियों को लोड करने, सहेजने, प्रदर्शित करने और संसाधित करने के लिए उपयोगी सुविधाएँ प्रदान करती है। CImg एक बहुत ही हल्का और उपयोगकर्ता के अनुकूल पुस्तकालय है। अच्छी बात यह है कि यह जटिल निर्भरता और पुस्तकालय संगतता मुद्दों को संभालने से बचता है। यह एक एकल शीर्षलेख फ़ाइल CImg.h से बना है जिसे आपके C++ स्रोत में शामिल किया जाना चाहिए। यह कोड की कुछ ही पंक्तियों में जटिल इमेज प्रोसेसिंग गतिविधियों को निष्पादित करके डेवलपर्स की मदद करता है।
एपीआई उन्नत सुविधाओं का समर्थन करता है जैसे 3 डी छवियों को संभालना, छवियों को बदलना, छवि फ़िल्टरिंग, छवि एनीमेशन, छवि बिनाराइजेशन, और बहुत कुछ। CImg पुस्तकालय बहुत पोर्टेबल और स्व-निहित है। इसे आसानी से विभिन्न ऑपरेटिंग सिस्टम पर आसानी से इस्तेमाल किया जा सकता है। इसके अलावा, यह कई C++ कंपाइलर जैसे Visual C++, ICC, G++, आदि के साथ भी बहुत संगत है।
CImg . के साथ शुरुआत करना
CImg लाइब्रेरी .zip पैकेज के रूप में उपलब्ध है जो प्लेटफॉर्म-स्वतंत्र है। इसमें विभिन्न उदाहरणों के साथ सभी आवश्यक फाइलें शामिल हैं, जो दिखाती हैं कि पुस्तकालय कार्यों और कक्षाओं का उपयोग कैसे करें।
सीआईएमजी के साथ काम करने में सक्षम होने के लिए आपको इन दो पंक्तियों को अपने सी ++ स्रोत कोड में जोड़ना होगा।
CImg काम करने के लिए इन पंक्तियों को जोड़ें
#include "CImg.h"
using namespace cimg_library
Git के माध्यम से CImg का नवीनतम संस्करण प्राप्त करें
git clone --depth=1 https://github.com/GreycLab/CImg.git
चित्र बनाने और संशोधित करने के लिए C++ API
सीआईएमजी ओपन-सोर्स लाइब्रेरी सी ++ डेवलपर्स को अपने स्वयं के अनुप्रयोगों के अंदर विभिन्न प्रकार की छवियों को बनाने और हेरफेर करने की अनुमति देती है। यह इमेज डिस्प्ले और माउस इवेंट्स को हैंडल करने के तरीके का भी समर्थन करता है। सबसे पहले, आपको CImg लाइब्रेरी की मुख्य और एकमात्र शीर्षलेख फ़ाइलों को शामिल करने की आवश्यकता है। अच्छी बात यह है कि पुस्तकालय बहुत कम मात्रा में कोड लिखने की अनुमति देकर डेवलपर के भार को कम करता है। कृपया यह भी ध्यान दें कि स्रोत यूनिक्स और विंडोज सिस्टम पर पूरी तरह से काम करेगा।
सी ++ लाइब्रेरी के माध्यम से छवि बनाएं
#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;
}