Perpustakaan C++ Sumber Terbuka untuk Pemprosesan Imej
Gunakan Penapis Imej, Cipta, Manipulasi & Paparkan format fail Imej Popular menggunakan API C++ Percuma.
Perpustakaan CImg ialah perpustakaan sumber terbuka yang menyediakan ciri berguna untuk memuatkan, menyimpan, memaparkan dan memproses pelbagai jenis imej dalam aplikasi C++. CImg ialah perpustakaan yang sangat ringan dan mesra pengguna. Perkara yang baik ialah ia mengelakkan pengendalian kebergantungan kompleks dan isu keserasian perpustakaan. Ia diperbuat daripada fail pengepala tunggal CImg.h yang mesti disertakan dalam sumber C++ anda. Ia membantu pembangun dengan melakukan aktiviti pemprosesan imej yang kompleks dalam hanya beberapa baris kod.
API menyokong ciri lanjutan seperti mengendalikan imej 3D, Mengubah imej, penapisan imej, animasi imej, Perduaan Imej dan banyak lagi. Perpustakaan CImg sangat mudah alih & serba lengkap. Ia boleh digunakan dengan mudah pada sistem pengendalian yang berbeza dengan mudah. Selain itu, ia juga sangat serasi dengan banyak pengkompil C++ seperti Visual C++, ICC, G++, dsb.
Bermula dengan CImg
Perpustakaan CImg tersedia sebagai pakej .zip yang tidak bergantung pada platform. Ia mengandungi semua fail yang diperlukan, bersama-sama dengan pelbagai contoh, yang menunjukkan cara menggunakan fungsi dan kelas perpustakaan.
Anda perlu menambah dua baris ini dalam kod sumber C++ anda, untuk dapat berfungsi dengan CImg.
Tambahkan baris ini untuk CImg berfungsi
#include "CImg.h"
using namespace cimg_library
Dapatkan Versi Terkini CImg melalui Git
git clone --depth=1 https://github.com/GreycLab/CImg.git
API C++ untuk Mencipta & Mengubah Suai Imej
Pustaka sumber terbuka CImg membolehkan pembangun C++ mencipta dan memanipulasi pelbagai jenis imej dalam aplikasi mereka sendiri. Ia juga menyokong cara mengendalikan paparan imej dan acara tetikus. Pertama sekali, anda perlu memasukkan fail pengepala utama dan satu-satunya perpustakaan CImg. Perkara yang baik ialah perpustakaan mengurangkan beban pembangun dengan membenarkan mereka menulis jumlah kod yang sangat kecil. Sila ambil perhatian juga bahawa sumber akan berfungsi dengan sempurna pada sistem UNIX dan Windows.
Cipta Imej melalui perpustakaan 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;
}
Sokongan Penapisan Imej
Pustaka CImg menyediakan sokongan untuk proses penapisan imej. Kadangkala kita perlu mendapatkan semula maklumat tentang imej dan di situlah penapisan imej biasa digunakan. Proses penapisan imej adalah salah satu kaedah yang paling biasa digunakan pada imej untuk mendapatkan maklumat. Selalunya, penapis digunakan dalam penyingkiran hingar imej, derivatif imej komputer, peningkatan tepi imej, analisis bentuk dan banyak lagi.
Gunakan Penapisan Fourier dalam Apl 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;
}