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()
出力:
上記の例では、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()
出力:
上記のコードでは、水平方向にのみ導関数を計算し、dy
パラメーターの値を 0 とします。導関数を垂直方向に計算するには、dx
パラメーターを 0 とします。
この例では、カーネルサイズを 5x5 として使用していることに注意してください。3x3 サイズを使用することもできますが、この場合、結果には多くの不正確さが含まれるため、お勧めしません。
Scharr フィルターは、Sobel に似た別の演算子であり、3x3 の場合に使用できます。
まとめ
このチュートリアルでは、OpenCV ライブラリの Sobel()
関数を使用して説明しました。まず、エッジ検出のための Sobel アルゴリズムについて理解することから始めました。
画像勾配の基本と、Sobel 演算子がこれを効率的に計算する方法を理解しました。さまざまな状況の例が記事に示されています。
3x3 カーネルを使用することの欠点についても説明し、その代替手段である Scharr フィルターを使用して、この場合により良い結果を提供できます。
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 ArUco マーカー
- OpenCV しきい値
- OpenCV でのイメージ マスキング
- OpenCV パッケージ構成
- OpenCV を使用してイメージで Bitwise_AND を利用する
- Python で OpenCV を使用した SIFT