ছবি প্রক্রিয়াকরণের জন্য ওপেন সোর্স C++ লাইব্রেরি

ফ্রি C++ API ব্যবহার করে ইমেজ ফিল্টার প্রয়োগ করুন, তৈরি করুন, ম্যানিপুলেট করুন এবং জনপ্রিয় ইমেজ ফাইল ফরম্যাট রেন্ডার করুন।

CImg লাইব্রেরি হল একটি ওপেন সোর্স লাইব্রেরি যা C++ অ্যাপ্লিকেশনের মধ্যে বিভিন্ন ধরনের ছবি লোড, সংরক্ষণ, প্রদর্শন এবং প্রক্রিয়াকরণের জন্য দরকারী বৈশিষ্ট্য প্রদান করে। CImg একটি খুব হালকা এবং ব্যবহারকারী-বান্ধব লাইব্রেরি। ভাল জিনিস হল যে এটি জটিল নির্ভরতা এবং লাইব্রেরি সামঞ্জস্যের সমস্যাগুলি পরিচালনা করে। এটি একটি একক হেডার ফাইল CImg.h দিয়ে তৈরি যা অবশ্যই আপনার C++ উৎসে অন্তর্ভুক্ত করতে হবে। এটি কোডের কয়েকটি লাইনে জটিল চিত্র প্রক্রিয়াকরণ কার্যক্রম সম্পাদন করে বিকাশকারীদের সাহায্য করে।

API 3D চিত্র পরিচালনা, চিত্র রূপান্তর, চিত্র ফিল্টারিং, চিত্র অ্যানিমেশন, চিত্র বাইনারিকরণ এবং আরও অনেক কিছুর মতো উন্নত বৈশিষ্ট্যগুলিকে সমর্থন করে। CImg লাইব্রেরি খুব বহনযোগ্য এবং স্বয়ংসম্পূর্ণ। এটি বিভিন্ন অপারেটিং সিস্টেমে সহজেই ব্যবহার করা যায়। তাছাড়া, এটি অনেক C++ কম্পাইলার যেমন ভিজ্যুয়াল C++, ICC, G++, ইত্যাদির সাথেও খুব সামঞ্জস্যপূর্ণ।

Previous Next

CImg দিয়ে শুরু করা

CImg লাইব্রেরি .zip প্যাকেজ হিসাবে উপলব্ধ যা প্ল্যাটফর্ম-স্বাধীন। এটিতে বিভিন্ন উদাহরণ সহ প্রয়োজনীয় সমস্ত ফাইল রয়েছে, যা লাইব্রেরি ফাংশন এবং ক্লাসগুলি কীভাবে ব্যবহার করতে হয় তা দেখায়।

CImg এর সাথে কাজ করতে সক্ষম হওয়ার জন্য আপনাকে আপনার C++ সোর্স কোডে এই দুটি লাইন যোগ করতে হবে।

CImg কাজ করার জন্য এই লাইনগুলি যোগ করুন

 #include "CImg.h" 
using namespace cimg_library 

গিট এর মাধ্যমে CImg এর সর্বশেষ সংস্করণ পান

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;
}
 বাংলা