OpenCV sobel()関数

Manav Narula 2023年1月30日
  1. Python で OpenCV を使用した Sobel() 関数を使用したエッジ検出
  2. まとめ
OpenCV sobel()関数

OpenCV ライブラリを使用して、さまざまな手法を処理して画像に適用できます。このようなプロセスは、複雑なコンピュータビジョンタスクの不可欠な部分を形成します。そのようなタスクの 1つは、画像のエッジ検出です。

エッジは、画像内のオブジェクトの境界または輪郭であり、ピクセルの密度の非常に高い変化に関連付けられています。隣接するピクセルの密度を比較することで、エッジを検出できます。

エッジ検出にはさまざまなアルゴリズムが利用可能であり、OpenCV ライブラリに適用されます。そのような手法の 1つに、SobelEdgeDetection アルゴリズムがあります。

このチュートリアルでは、Python で OpenCV を使用する Sobel アルゴリズムを示します。

Python で OpenCV を使用した Sobel() 関数を使用したエッジ検出

ソーベルエッジ検出アルゴリズムは、画像勾配を使用して、画像内のエッジを予測および検出します。このアルゴリズムを使用して、ピクセル密度を比較してエッジを検出します。

関数の一次導関数を計算して、ピークポイントを見つけます。次に、これらがしきい値と比較されます。

この手法では、Sobel 演算子が関数の勾配を計算します。これは、ガウス平滑化と微分を組み合わせたものです。

通常、カーネルを使用して画像を滑らかにしたりぼかしたりしますが、この場合は、カーネルを使用してグラデーションを計算します。デリバティブは、x 軸と y 軸の両方に沿って計算されます。

特定のポイントでの勾配は、これらの両方の値を使用して計算されます。この勾配値はノイズが発生しにくく、エッジ検出に使用されます。

OpenCV ライブラリは、Sobel() 関数を使用してこれを実装します。画像とともにいくつかのパラメータで関数を指定する必要があります。

ddepth パラメータで指定された最終画像の深度について言及する必要があります。値が-1 の場合、出力画像は入力画像と同じ深度になります。

使用される導関数の順序は、dx および dy パラメーターを使用して指定されます。拡張 Sobel カーネルのサイズは、ksize パラメーターを使用して示されます。

scale および delta パラメーターはオプションです。例を見てみましょう。

import cv2

i = cv2.imread("deftstack.png")
img = cv2.GaussianBlur(i, (3, 3), sigmaX=0, sigmaY=0)

edge_sobel = cv2.Sobel(src=img, ddepth=cv2.CV_64F, dx=1, dy=1, ksize=5)

cv2.imshow("Output", edge_sobel)
cv2.waitKey(0)
cv2.destroyAllWindows()

出力:

X 軸と Y 軸に沿った Sobel を使用したエッジ検出

上記の例では、Sobel() 関数を使用しました。x 軸と y 軸に沿って一次導関数を計算し、勾配を取得しました。これを使用して、輪郭を見つけます。

ddepth パラメータで指定されているように、最終的なイメージは 64 ビットです。使用されるカーネルのサイズは 5x5 です。

GaussianBlur() 関数に注意してください。これは特定の画像をぼかすために使用され、Sobel 演算子は画像をぼかすのに最適です。waitKey() および destroyAllWindows() 関数は、出力ウィンドウが閉じないようにし、ユーザーが何らかのキーを押して終了するのを待ちます。

説明したように、上記の例では x 軸と y 軸に沿って導関数を計算しました。もう一方の導関数を 0 とすると、どちらかの軸に沿って導関数を計算することもできます。

例えば、

import cv2

i = cv2.imread("deftstack.png")
img = cv2.GaussianBlur(i, (3, 3), sigmaX=0, sigmaY=0)

edge_sobel = cv2.Sobel(src=img, ddepth=cv2.CV_64F, dx=1, dy=0, ksize=5)

cv2.imshow("Output", edge_sobel)
cv2.waitKey(0)
cv2.destroyAllWindows()

出力:

X 軸に沿った Sobel を使用したエッジ検出

上記のコードでは、水平方向にのみ導関数を計算し、dy パラメーターの値を 0 とします。導関数を垂直方向に計算するには、dx パラメーターを 0 とします。

この例では、カーネルサイズを 5x5 として使用していることに注意してください。3x3 サイズを使用することもできますが、この場合、結果には多くの不正確さが含まれるため、お勧めしません。

Scharr フィルターは、Sobel に似た別の演算子であり、3x3 の場合に使用できます。

まとめ

このチュートリアルでは、OpenCV ライブラリの Sobel() 関数を使用して説明しました。まず、エッジ検出のための Sobel アルゴリズムについて理解することから始めました。

画像勾配の基本と、Sobel 演算子がこれを効率的に計算する方法を理解しました。さまざまな状況の例が記事に示されています。

3x3 カーネルを使用することの欠点についても説明し、その代替手段である Scharr フィルターを使用して、この場合により良い結果を提供できます。

著者: Manav Narula
Manav Narula avatar Manav Narula avatar

Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.

LinkedIn

関連記事 - Python OpenCV

関連記事 - OpenCV Image