مكتبة مفتوحة المصدر C ++ لمعالجة الصور

قم بتطبيق مرشحات الصور وإنشاء تنسيقات ملفات الصور الشائعة ومعالجتها وعرضها باستخدام Free C ++ API.

مكتبة CImg هي مكتبة مفتوحة المصدر توفر ميزات مفيدة لتحميل أنواع مختلفة من الصور وحفظها وعرضها ومعالجتها داخل تطبيقات C ++. CImg هي مكتبة خفيفة الوزن وسهلة الاستخدام. الشيء الجيد هو أنه يتجنب التعامل مع التبعيات المعقدة ومشاكل توافق المكتبات. يتكون من ملف رأس واحد CImg.h يجب تضمينه في مصدر C ++. يساعد المطورين من خلال أداء أنشطة معالجة الصور المعقدة في بضعة أسطر من التعليمات البرمجية.

تدعم واجهة برمجة التطبيقات ميزات متقدمة مثل التعامل مع الصور ثلاثية الأبعاد ، وتحويل الصور ، وتصفية الصور ، والرسوم المتحركة للصور ، وثنائية الصور ، والمزيد. مكتبة CImg محمولة ومكتفية ذاتيًا. يمكن استخدامه بسهولة على أنظمة التشغيل المختلفة بكل سهولة. علاوة على ذلك ، فهو متوافق أيضًا مع العديد من برامج التحويل البرمجي لـ C ++ مثل Visual C ++ و ICC و G ++ وما إلى ذلك.

Previous Next

الشروع في استخدام 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 ++ لإنشاء وتعديل الصور

تسمح مكتبة 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 دعمًا لعملية تصفية الصور. نحتاج في بعض الأحيان إلى استرداد معلومات حول الصور وهذا هو المكان الذي تستخدم فيه تصفية الصور بشكل شائع. تعد عملية تصفية الصور من أكثر الطرق شيوعًا لتطبيقها على الصور لاسترداد المعلومات. في الغالب ، تُستخدم المرشحات في إزالة ضوضاء الصورة ، ومشتقات صور الكمبيوتر ، وتحسين حافة الصورة ، وتحليل الشكل ، والمزيد.

تطبيق Fourier Filtering في تطبيقات 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;
}
 عربي