Search on the blog

2014年4月13日日曜日

OpenCV日記(2)カスタム線形フィルタを画像に適用する

 線形フィルタを画像に適用して、適用結果を表示するプログラムを書いてみました。
以下のサンプルプログラムを参考にしました。

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 件のコメント:

コメントを投稿