ไลบรารี C++ โอเพ่นซอร์สสำหรับการประมวลผลภาพ

ใช้ตัวกรองรูปภาพ สร้าง จัดการ และแสดงผลรูปแบบไฟล์รูปภาพยอดนิยมโดยใช้ C++ API ฟรี

CImg ห้องสมุดเป็นห้องสมุดโอเพนซอร์สที่มีคุณสมบัติที่เป็นประโยชน์สําหรับการโหลดการบันทึกการแสดงและการประมวลผลภาพประเภทต่างๆภายใน C++ การใช้งาน CImg เป็นห้องสมุดที่มีน้ําหนักเบาและใช้งานง่าย สิ่งที่ดีคือหลีกเลี่ยงการจัดการการพึ่งพาที่ซับซ้อนและปัญหาความเข้ากันได้ของห้องสมุด มันทําจากไฟล์หัวเดียว CImg.h ที่จะต้องรวมอยู่ในแหล่ง C++ ของคุณ ช่วยให้นักพัฒนาโดยการดําเนินกิจกรรมการประมวลผลภาพที่ซับซ้อนในเพียงไม่กี่บรรทัดของรหัส

API รองรับคุณสมบัติขั้นสูงเช่นการจัดการภาพ 3D, การแปลงภาพ, การกรองภาพ, ภาพเคลื่อนไหว, ภาพ Binarization และอีกมากมาย ห้องสมุด CImg เป็นแบบพกพามากและมีในตัว สามารถใช้กับระบบปฏิบัติการต่างๆได้อย่างง่ายดาย นอกจากนี้มันยังเข้ากันได้กับ compilers C++ จํานวนมากเช่น ภาพ 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;
}

รองรับการกรองภาพ

ห้องสมุด CImg ให้การสนับสนุนสําหรับกระบวนการกรองภาพ บางครั้งเราจําเป็นต้องดึงข้อมูลเกี่ยวกับภาพและนั่นคือการใช้การกรองภาพ กระบวนการกรองภาพเป็นหนึ่งในวิธีที่พบมากที่สุดเพื่อใช้กับภาพเพื่อดึงข้อมูล ส่วนใหญ่ตัวกรองจะใช้ในการกําจัดเสียงรบกวนภาพอนุพันธ์ภาพคอมพิวเตอร์การเพิ่มประสิทธิภาพขอบภาพการวิเคราะห์รูปร่างและอื่น ๆ

ใช้ตัวกรอง 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;
}
 ไทย