ספריית קוד פתוח C++ לעיבוד תמונות

החל מסנני תמונות, צור, עשה מניפולציה ועיבוד פורמטים של תמונות פופולריות באמצעות API C++ בחינם.

ספריית CImg היא ספריית קוד פתוח המספקת תכונות שימושיות לטעינה, שמירה, הצגה ועיבוד סוגים שונים של תמונות בתוך יישומי C++. ה-CImg היא ספרייה קלה מאוד וידידותית למשתמש. הדבר הטוב הוא שהוא נמנע מטיפול בתלות מורכבות ובבעיות תאימות של ספריות. הוא עשוי מקובץ כותרת בודד CImg.h שחייב להיכלל במקור C++ שלך. זה עוזר למפתחים על ידי ביצוע פעולות עיבוד תמונה מורכבות בכמה שורות קוד בלבד.

ה-API תומך בתכונות מתקדמות כמו טיפול בתמונות תלת מימד, שינוי תמונות, סינון תמונות, אנימציית תמונות, בינאריזציה של תמונות ועוד. ספריית 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++ 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;
}
 עִברִית