画像処理用のオープン ソース C++ ライブラリ
無料の C++ API を使用して、画像フィルターを適用し、一般的な画像ファイル形式を作成、操作、レンダリングします。
CImg ライブラリは、C++ アプリケーション内でさまざまな種類の画像を読み込み、保存、表示、および処理するための便利な機能を提供するオープン ソース ライブラリです。 CImg は非常に軽量で使いやすいライブラリです。良いことは、複雑な依存関係やライブラリの互換性の問題を処理することを回避できることです。これは、C++ ソースに含める必要がある単一のヘッダー ファイル CImg.h で構成されています。わずか数行のコードで複雑な画像処理アクティビティを実行することで、開発者を支援します。
この API は、3D 画像の処理、画像の変換、画像フィルタリング、画像アニメーション、画像の二値化などの高度な機能をサポートしています。 CImg ライブラリは移植性が高く、自己完結型です。さまざまなオペレーティング システムで簡単に使用できます。さらに、Visual C++、ICC、G++ などの多数の C++ コンパイラとも互換性があります。
CImg の概要
CImgライブラリは、プラットフォームに依存しない.zipパッケージとして利用できます。 ライブラリ機能とクラスの使用方法を示す、さまざまな例とともに、必要なすべてのファイルが含まれています。
CImg を使用できるようにするには、C++ ソース コードにこれらの 2 行を追加する必要があります。
CImg が機能するようにこれらの行を追加します
#include "CImg.h"
using namespace cimg_library
GitでCImgの最新バージョンを入手
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ライブラリは、画像フィルタリングプロセスのサポートを提供します。 場合によっては、画像に関する情報を取得する必要があります。画像のフィルタリングが一般的に使用される場所です。 画像フィルタリングプロセスは、情報を取得する画像に適用するための最も一般的な方法の1つです。 ほとんどの場合、フィルタは画像のノイズ除去、コンピュータ画像の誘導体、画像エッジの強化、形状解析などに使用されます。
適用する クーリエ フィルター に 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;
}