旅行好きなソフトエンジニアの備忘録

プログラミングや技術関連のメモを始めました

【OpenCV】 輪郭を強調する

先鋭化フィルタを適用して輪郭を強調する例をメモします。OpenCVには用意されていない関数ですが、フィルタを自作して適用することで簡単に作成することが出来ます。作成するフィルタは以下の通りです(http://www.wakayama-u.ac.jp/~chen/education/image/2012/L8.pdf)。

4近傍

$$ \left( \begin{array}{ccc} 0 & -1 & 0 \\ -1 & 5 & -1 \\ 0 & -1 & 0 \\ \end{array} \right) $$

8近傍

$$ \left( \begin{array}{ccc} -1 & -1 & -1 \\ -1 & 9 & -1 \\ -1 & -1 & -1 \\ \end{array} \right) $$

// 画像を読み込む
Mat source;
imread("picture.jpg").copyTo(source);
if (source.empty())
{
    throw runtime_error("Failed to open image");
}

// 先鋭化フィルタを作成する
const float k = -1.0;
Mat sharpningKernel4 = (Mat_<float>(3, 3) << 0.0, k, 0.0, k, 5.0, k, 0.0, k, 0.0);
Mat sharpningKernel8 = (Mat_<float>(3, 3) << k, k, k, k, 9.0, k, k, k, k);

// 先鋭化フィルタを適用する
Mat destination;
cv::filter2D(source, destination, source.depth(), sharpningKernel8);

imshow("source", source);
imshow("destination", destination);

f:id:ni4muraano:20170415170026j:plain:w200 f:id:ni4muraano:20170415170032j:plain:w200