OpenCV (26): エッジ検出 (2)

目次

1. ラプラシアン演算子のエッジ検出

原理:

ラプラシアンエッジ検出関数 Laplacian()

サンプルコード:

2. Canny オペレーターエッジ検出

原理:

Canny アルゴリズム関数 Canny()

サンプルコード:


1. ラプラシアン演算子のエッジ検出

原理:

        ラプラシアン演算子の原理は、画像の二次導関数に基づいています。一次導関数は画像内のエッジを検出するのに役立ち、二次導関数はエッジの交差点、つまり画像内のコーナーを検出できます。

ラプラシアン オペレーターは 2 次空間導関数の合計として定義され、2 次元の場合の画像処理に使用されます。その離散形式は次のとおりです。

L(x, y) = d^2(I(x, y)) / dx^2 + d^2(I(x, y)) / dy^2 

このうち、I(x,y)は画像内の画素値、d^2は偏微分値、dxはX方向の微分値、dyはY方向の微分値を表します。

ラプラシアン演算子は、離散畳み込みを適用することで計算できます。一般的な離散ラプラシアン演算子のテンプレートは次のとおりです。

 
 

このテンプレートを画像と畳み込むことにより、画像内の各ピクセルのラプラシアン応答を計算できます。

具体的な手順は次のとおりです。

  1. 画像をグレースケールに変換します (グレースケールでない場合)。
  2. 画像にラプラシアン演算子を適用するための個別のテンプレート。
  3. 畳み込み結果を閾値処理してエッジ情報を抽出します。
  4. 非最大値抑制やエッジ接続などの後処理操作は、閾値処理されたエッジ画像に対してオプションで実行されます。

ラプラシアン オペレーターの出力は、エッジを表す高周波成分イメージです。通常、エッジは明るいピクセルと暗いピクセルの間の境界として表示されます。エッジの幅と強度は、ラプラシアン オペレーターのサイズと画像内のグレースケールの変化によって異なります。

ラプラシアンエッジ検出関数 Laplacian()

void cv::Laplacian (InputArray src,

出力配列 dst、

整数の深さ、

int ksize = 1、

ダブルスケール = 1、

ダブルデルタ =0、

int borderType = ボーダーのデフォルト

  • src: 元の画像を入力します。グレースケール画像またはカラー画像を指定できます。
  • dst: 出力イメージ。入力イメージ src と同じサイズとチャネル数を持ちます。
  • d Depth: 出力画像のデータ型 (深度)。入力画像のデータ型に応じて値の範囲が異なります。
  • ksize: フィルターのサイズ。正の奇数である必要があります。
  • スケール: 微分計算結果をスケールするためのスケール係数。デフォルトの係数は 1 で、スケールは実行されません。
  • デルタ: バイアス値。計算結果にバイアス値を加算します。
  • borderType: ピクセル外挿オプション フラグ。
サンプルコード:
void Laplacian_f(Mat image){
    Mat gray;
    cvtColor(image,gray,COLOR_BGR2GRAY);
    Mat result,result_g,result_G;
    //未滤波提取边缘
    Laplacian(gray,result,CV_16S,3,1,0);
    convertScaleAbs(result,result);
    //滤波后提取边缘
    GaussianBlur(gray,result_g,Size(3,3),5,0);//高斯滤波
    Laplacian(result_g,result_G,CV_16S,3,1,0);
    convertScaleAbs(result_G,result_G);
    //显示图像
    imwrite("/sdcard/DCIM/result.png",result);
    imwrite("/sdcard/DCIM/result_G.png",result_G);
}

                   

  (フィルタリングせずにエッジ画像を抽出) (フィルタリング後にエッジ画像を抽出)

2. Canny オペレーターエッジ検出

原理:

Canny アルゴリズム関数 Canny()

void cv::Canny (InputArray 画像,

OutputArray エッジ、

二重閾値1、

二重閾値2、

int apertureSize = 3、

ブール L2gradient = false

  • 画像: 入​​力画像。CV 8U シングルチャネルまたは 3 チャネル画像である必要があります
  • エッジ: 出力イメージ。入力イメージと同じサイズの単一チャネル イメージ。データ タイプは CV 8U です。
  • しきい値1: 最初のヒステリシスしきい値
  • しきい値2: 2 番目のヒステリシスしきい値
  • apertureSize: Sobel オペレーターの直径
  • L2gradient: 画像の勾配の大きさを計算するための記号
サンプルコード:
void Canny_f(Mat image){
    Mat gray;
    cvtColor(image,gray,COLOR_BGR2GRAY);
    Mat resultHigh,resultLow,resultG;
    //大阈值检测图像边缘
    Canny(image,resultHigh,100,200,3);
    //小阈值检测图像边缘
    Canny(image,resultLow,20,40,3);
    //高斯模糊后检测图像边缘
    GaussianBlur(gray,resultG,Size(3,3),5);
    Canny(resultG,resultG,100,200,3);
    //显示图像
    imwrite("/sdcard/DCIM/resultHigh.png",resultHigh);
    imwrite("/sdcard/DCIM/resultLow.png",resultLow);
    imwrite("/sdcard/DCIM/resultG.png",resultG);
}

(大きい閾値で画像エッジを検出) (小さい閾値で画像エッジを検出) (ガウスブラー後の画像エッジを検出)

おすすめ

転載: blog.csdn.net/weixin_63357306/article/details/132735357
おすすめ