はじめに
今回はOpenCVを用いて簡単にできる「Sobel法」「 Laplacian法」「Canny法」でのエッジ検出法についてまとめます。
画像の保存などについては以前の記事で触れているので割愛し、エッジ検出に必要な関数についてのみ説明していきます。
また、プログラムの手順は元画像を読み込んだ後、それぞれ関数を実行するだけです。
Pythonでの実装はこちらの記事に書いてあります。
Sobel法
Sobel法でのエッジ検出は次のようにして行うことができます。
Sobel(入力画像,出力画像,ビット深度,xの微分次数,yの微分次数,カーネルのサイズ,結果に加える値);
カーネルのサイズ及び結果に加える値について、特に指定がない場合には書かなくても大丈夫です。
Laplacian法
Laplacian法でのエッジ検出は次のようにして行うことができます。
Laplacian(入力画像,出力画像,ビット深度,アパーチャサイズ,結果に加える値);
アパーチャサイズ及び結果に加える値について、特に指定がない場合には書かなくても大丈夫です。
Canny法
Canny法でのエッジ検出は次のようにして行うことができます。
Canny(入力画像,出力画像,閾値1,閾値2,アパーチャサイズ);
アパーチャサイズについて、特に指定がない場合には書かなくても大丈夫です。
ソースコード
#include <iostream> #include <opencv2/opencv.hpp> int main(){ cv::Mat gray, sobel, laplacian, canny; //画像格納用のオブジェクト宣言 gray = cv::imread("input.jpg", 0); //画像データの読み込み if (gray.empty()) { //エラー処理 std::cout << "error" << std::endl; return 0; } Sobel(gray, sobel, CV_32F, 1, 1, 1, 5); //Sobel法 //入力画像,出力画像,ビット深度,xの微分次数,yの微分次数,カーネルのサイズ,結果に加える値 Laplacian(gray, laplacian, CV_32F, 1, 5); //Laplacian法 //入力画像,出力画像,ビット深度,アパーチャサイズ,結果に加える値 Canny(gray,canny, 50, 100); //Cannuy法 //入力画像,出力画像,閾値1,閾値2 //画像の保存 cv::imwrite("sobel.jpg", sobel); cv::imwrite("laplacian.jpg", laplacian); cv::imwrite("canny.jpg", canny); sobel.release(); laplacian.release(); canny.release(); return 0; }
実際に実行する
次の画像に対してプログラムを実行した。
結果として次の三つの画像が得られた。
Sobel法
Laplacian法
Canny法
最後に
普段使っていないオプションとかがあると思いますが、使わないので必要ないです。多分。
コメント