以下のサンプルプログラムを参考にしました。
filter2D_demo.cpp
ソースコード
3 * 3の行列を標準入力から受け取って、その行列をカーネルとして画像に適用するようにしました。
#include "opencv2/imgproc/imgproc.hpp" #include "opencv2/highgui/highgui.hpp" #include <cstdlib> #include <iostream> using namespace cv; static const char* window_name = "filter2D Demo"; /** * 画像ファイルに3*3のカーネルを適用し、適用結果をウィンドウに表示する。 */ int main (int argc, char** argv ) { /// Check command args if (argc != 2) { std::cout << "specify an image file path at the first argument." << std::endl; return -1; } /// Load an image Mat src = imread(argv[1]); if (!src.data) { return -1; } /// Initialize arguments for the filter Point anchor = Point(-1, -1); double delta = 0; int ddepth = -1; /// Define a kernel matrix double kernel[3][3]; std::cout << "input a 3*3 filter matrix." << std::endl; for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) std::cin >> kernel[i][j]; /// Apply filter Mat dst; filter2D(src, dst, ddepth, Mat(3, 3, CV_64F, &kernel), anchor, delta, BORDER_DEFAULT); /// Show the result imshow(window_name, dst); waitKey(0); return 0; }
結果
lena.jpgにいくつかのカーネルフィルタを適用してみました。
まず、Original filter。Identity functionです。
0 0 0
0 1 0
0 0 0
次に、Edge-Detect filter。8近傍に対して微分しています。
-1 -1 -1
-1 8 -1
-1 -1 -1
Blur filter。ぼかしです。ぼかし効果をあげたい場合は、行列のサイズを大きくするとよいです。
1/9 1/9 1/9
1/9 1/9 1/9
1/9 1/9 1/9
Contrast filter(このフィルタ名は勝手につけました)。セルの輝度を定数倍してみます。
0 0 0
0 2 0
0 0 0
0 件のコメント:
コメントを投稿