Βιβλιοθήκη ανοιχτού κώδικα C++ για επεξεργασία εικόνας

Εφαρμόστε φίλτρα εικόνας, δημιουργήστε, χειριστείτε και αποδώστε δημοφιλείς μορφές αρχείων εικόνων χρησιμοποιώντας το δωρεάν C++ API.

Η Βιβλιοθήκη είναι μια βιβλιοθήκη ανοιχτού κώδικα που παρέχει χρήσιμες λειτουργίες για τη φόρτωση, την αποθήκευση, την προβολή και την επεξεργασία διαφόρων τύπων εικόνων μέσα σε C++ εφαρμογές. Το CImg είναι μια πολύ ελαφριά και φιλική προς το χρήστη βιβλιοθήκη. Το καλό είναι ότι αποφεύγει τη διαχείριση σύνθετων εξαρτήσεων και ζητημάτων συμβατότητας βιβλιοθηκών. Είναι κατασκευασμένο από ένα ενιαίο αρχείο επικεφαλίδας CImg.h που πρέπει να συμπεριληφθεί στην C++ πηγή σας. Βοηθά τους προγραμματιστές εκτελώντας πολύπλοκες δραστηριότητες επεξεργασίας εικόνας σε λίγες γραμμές κώδικα.

Το API υποστηρίζει προηγμένα χαρακτηριστικά όπως το χειρισμό 3D εικόνων, Μετασχηματισμός εικόνων, φιλτράρισμα εικόνας, κινούμενη εικόνα, Εικόνα Binarization και πολλά άλλα. Η βιβλιοθήκη είναι πολύ φορητή και αυτόνομη. Μπορεί να χρησιμοποιηθεί εύκολα σε διαφορετικά λειτουργικά συστήματα με ευκολία. Επιπλέον, είναι επίσης πολύ συμβατό με em n πολυάριθμους C++ μεταγλωττιστές όπως /em Visual C++, CC, 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;
}

Υποστήριξη φιλτραρίσματος εικόνας

Η βιβλιοθήκη παρέχει υποστήριξη για τη διαδικασία φιλτραρίσματος εικόνων. Μερικές φορές πρέπει να ανακτήσουμε πληροφορίες σχετικά με τις εικόνες και εκεί χρησιμοποιείται συνήθως το φιλτράρισμα εικόνων. Η διαδικασία φιλτραρίσματος εικόνων είναι μια από τις πιο συνηθισμένες μεθόδους για την εφαρμογή των εικόνων για την ανάκτηση πληροφοριών. Κυρίως, τα φίλτρα χρησιμοποιούνται στην αφαίρεση θορύβου εικόνας, παράγωγα εικόνας υπολογιστή, βελτίωση εικόνας, ανάλυση σχήματος και πολλά άλλα.

Εφαρμογή φίλτρου Courier σε 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;
}
 Ελληνικά