エッジ検出 - 0から戦闘OpenCVのN(2)〜

クリエイティブコモンズライセンス 著作権:帰属、紙ベースを作成するために他人を許可し、(同じライセンスで元のライセンス契約に基づいて用紙配布する必要がありますクリエイティブコモンズ

 

エッジ検出

1、Sobelオペレータは、離散微分演算子(離散微分演算子)です。近似勾配画像強度関数を計算するために使用されます。

Sobelオペレータ及びガウシアン平滑化誘導体の結合の差動。エッジ画像における有意な変化は、一次導関数の極値のエッジを得ることができます。

図2に示すように、二次導関数を使用して、ラプラス演算子は、エッジを検出するために使用することができます。画像のエッジで、一次導関数が極値、及び二次導関数のゼロ交差です。

画像は「2-D」であるため、我々は両方の方向に微分を必要とします。導出過程が簡単になりますラプラス演算子を使用してください。

図3に示すように、キャニーオペレータは、ジョンF.キャニーは、多くの人々は、エッジ検出のための最適なアルゴリズムと考えられている、1986年にマルチレベルのエッジ検出アルゴリズムを開発しています

エッジ検出の最適な三つの主要な評価基準は以下のとおりです。

低エラーレートが:偽陽性を低減しつつ、可能な限り実際のエッジを識別可能なノイズを生成しました。

高い位置決め:できるだけ近い実エッジ画像で識別されるエッジ。

最小応答:画像のエッジは一度だけ識別することができます。

*ヒステリシス閾値:最終ステップ、キャニーヒステリシス閾値を用いては、ヒステリシス閾値は、二つの閾値(高閾値および低閾値)を必要とします。

画素位置の大きさが高しきい値を超えた場合、ピクセルは予約エッジ画素です。

画素位置の大きさが低閾値未満である場合、ピクセルは除外されます。

大きさが保持されている場合は二つの閾値の間での画素位置が、画素に接続された画素のみが高閾値を超えている場合。

*キャニー推奨高:低閾値比2:1:1-3。

4出典:


Mat edge_sobel(Mat src)

{

Mat dst, src_gray;

GaussianBlur(src, src, Size(3, 3), 0, 0, BORDER_DEFAULT);



/// 转换为灰度图

if (src.channels() > 1)

{

cvtColor(src, src_gray, CV_RGB2GRAY);

}

else

{

src_gray = src.clone();

}



Mat grad;

int scale = 1;

int delta = 0;

int ddepth = CV_16S;



/// 创建 grad_x 和 grad_y 矩阵

Mat grad_x, grad_y;

Mat abs_grad_x, abs_grad_y;



/// 求 X方向梯度

Sobel(src_gray, grad_x, ddepth, 1, 0, 3, scale, delta, BORDER_DEFAULT);

convertScaleAbs(grad_x, abs_grad_x);



/// 求Y方向梯度

Sobel(src_gray, grad_y, ddepth, 0, 1, 3, scale, delta, BORDER_DEFAULT);

convertScaleAbs(grad_y, abs_grad_y);



/// 合并梯度(近似)

addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0, grad);

//imshow("x", abs_grad_x);

//imshow("y", abs_grad_y);

imshow("Sobel", grad);



return grad;



}



Mat edge_laplacian(Mat src)

{

int scale = 1;

int delta = 0;

int ddepth = CV_16S;

Mat src_gray;

if (src.channels() > 1)

{

cvtColor(src, src_gray, CV_RGB2GRAY);

}

else

{

src_gray = src.clone();

}

Mat edge;

GaussianBlur(src_gray, src_gray, Size(3, 3), 0, 0, BORDER_DEFAULT);

Laplacian(src_gray, edge, ddepth, 3, scale, delta, BORDER_DEFAULT);



convertScaleAbs(edge, edge);

imshow("Laplacian", edge);

return edge;

}





Mat edge_canny(Mat src,double th1,double th2)

{

Mat edge;

GaussianBlur(src, src, Size(3, 3), 0, 0, BORDER_DEFAULT);

Canny(src, edge, th1, th2);



imshow("Canny", edge);

return edge;

}





int main(int argc, char** argv)

{



Mat img = imread("2.jpg", IMREAD_COLOR);

imshow("img", img);

edge_sobel(img);

edge_laplacian(img);

edge_canny(img,20,60);



waitKey(0);



}

5、営業成績 

 

 

マイクロチャンネル公衆番号にもっと注意:ML_Study

 

 

おすすめ

転載: blog.csdn.net/qq_34106574/article/details/93479658