Thư viện C ++ mã nguồn mở để xử lý hình ảnh

Áp dụng Bộ lọc Hình ảnh, Tạo, Thao tác & Kết xuất các định dạng tệp Hình ảnh Phổ biến bằng API C ++ Miễn phí.

CImg thư viện là một thư viện nguồn mở cung cấp các tính năng hữu dụng để nạp, cứu, xuất hiện, và xử lý các loại hình ảnh khác nhau trong C++ ứng dụng. CImg là một thư viện rất nhẹ và thân thiện với người dùng. Điều tốt là nó tránh xử lý sự phụ thuộc phức tạp và các vấn đề tương thích thư viện. Nó được tạo ra bởi một hồ sơ đầu tiên CImg.h phải được bao gồm trong nguồn C++ của anh. Nó giúp các nhà phát triển bằng cách thực hiện các hoạt động xử lý hình ảnh phức tạp trong vài dòng mã.

API hỗ trợ các tính năng tiên tiến như xử lý hình ảnh 3D, chuyển hình ảnh, bộ lọc hình ảnh, hoạt hình ảnh, hình ảnh Binarization, và nhiều hơn nữa. CImg thư viện rất di động và tự giữ. Nó có thể dễ dàng được sử dụng trên các hệ thống hoạt động khác nhau. Hơn nữa, nó cũng rất tương thích với những người biên dịch viên C++ số như Visual C++, CC, G++, v.v.

Previous Next

Bắt đầu với CImg

Thư viện CImg có sẵn như gói .zip mà là sự phụ thuộc vào nền tảng. Nó chứa tất cả các hồ sơ yêu cầu, cùng với các ví dụ khác nhau, cho thấy cách sử dụng các chức năng và lớp thư viện.

Bạn cần thêm hai dòng này vào mã nguồn C ++ của mình để có thể làm việc với CImg.

Thêm các dòng này để CImg hoạt động

 #include "CImg.h" 
using namespace cimg_library 

Đưa phiên bản mới nhất của CImg qua Git

git clone --depth=1 https://github.com/GreycLab/CImg.git

API C ++ để tạo và sửa đổi hình ảnh

Thư viện mã nguồn mở CImg cho phép các nhà phát triển C ++ tạo và thao tác các loại hình ảnh khác nhau bên trong các ứng dụng của riêng họ. Nó cũng hỗ trợ cách xử lý các sự kiện hiển thị hình ảnh và chuột. Trước hết, bạn cần bao gồm các tệp tiêu đề chính và duy nhất của thư viện CImg. Điều tốt là thư viện giảm tải cho nhà phát triển bằng cách cho phép họ viết một lượng mã rất nhỏ. Cũng xin lưu ý rằng nguồn sẽ hoạt động hoàn hảo trên hệ thống UNIX và Windows.

Tạo hình ảnh bằng C++ thư viện

 #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;
}

Hỗ trợ lọc hình ảnh

CImg thư viện cung cấp sự hỗ trợ cho quá trình lọc hình ảnh. Đôi khi chúng ta cần lấy thông tin về hình ảnh và bộ lọc hình ảnh thường được sử dụng. Quá trình lọc hình ảnh là một trong những phương pháp phổ biến nhất để áp dụng để thu thập thông tin. Hầu hết các bộ lọc được sử dụng trong việc xóa hình ảnh, các dẫn xuất hình ảnh máy tính, cải tiến hình ảnh, phân tích hình dạng, và nhiều hơn nữa.

Áp dụng Courier Filtering trong C++ ứng dụng

 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;
}
 Tiếng Việt