【C++】OpenCVを用いた画像のエッジ検出【画像処理】

スポンサーリンク
Laplacian法 画像処理
スポンサーリンク

はじめに

今回は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;
}

実際に実行する

次の画像に対してプログラムを実行した。

OpenCVエッジ検出検証画像
元画像

結果として次の三つの画像が得られた。

Sobel法

Sobel法
Sobel法でエッジ検出した結果

Laplacian法

Laplacian法
Laplacian法でエッジ検出した結果

Canny法

Canny法
Canny法でエッジ検出した結果

最後に

普段使っていないオプションとかがあると思いますが、使わないので必要ないです。多分。

コメント

タイトルとURLをコピーしました