[複製] OpenCV-PythonシリーズのSobelおよびScharrオペレーター(23)

前のチュートリアルで小さな卵を残しました-形態の勾配問題です。通常、これは画像の輪郭を抽出するために使用されます。今日は、形態勾配よりも優れた画像エッジの別の方法を理解します。より効果的で、適用範囲が広がります。

ソーベル演算子

前の例では、画像のたたみ込み演算についてすでに触れています。最後の畳み込み演算の1つは、画像の微分(または近似微分)を計算することです。画像の微分の計算が重要なのはなぜですか?次のエッジ検出の例を見てください。
ここに画像の説明を挿入

上の画像では、ピクセルのグレー値が不規則に変化していることがわかります。この変更を説明するより良い方法は、導関数を使用することです。グラデーションが急激に変化する場所は、画像のグレー値が大きく変化する場所、つまりエッジを表します。

より良い説明のために、例として1次元の画像(つまり、画像の1行)を取り上げます。下の図に示すように、灰色の値がジャンプする場所にエッジが表示されます。
ここに画像の説明を挿入

上記の1次元画像の導関数を取得して次の図を取得すると、エッジの位置がはっきりとわかります。
ここに画像の説明を挿入

上記の説明から、局所的なピクセル変化の強度に応じて画像のエッジを取得するためのしきい値を設定できます。

ソーベル演算子は、画像勾配の近似値を計算する離散微分演算子です。ソーベル演算子は、ガウスの平滑化と微分を組み合わせたものです。

入力画像がIで、カーネルサイズが3であると仮定すると、水平方向と垂直方向の差分は、次の演算によって計算されます。

a。水平方向:
ここに画像の説明を挿入

b。垂直方向:
ここに画像の説明を挿入

具体的な操作は次のとおりです。
ここに画像の説明を挿入

上記の結果を組み合わせると、画像内の点のおおよその勾配を計算できます。
ここに画像の説明を挿入

または次のように表されます:
ここに画像の説明を挿入

カーネルのサイズが3の場合、つまり、上記のSobelカーネルは明らかなエラーを生成する可能性があることに注意してください(結局、Sobelは微分の近似にすぎません)。

OpenCV-Pythonでは、Sobelを使用するオペレーターの関数プロトタイプは次のとおりです。

dst = cv2.Sobel(src、ddepth、dx、dy [、dst [、ksize [、scale [、delta [、borderType]]]]])

最初の4つは必須パラメーターです。

最初のパラメータは処理される画像です。

2番目のパラメータは画像の深度です。-1は、元の画像と同じ深度が使用されることを意味します。ターゲット画像の深度は、元の画像の深度以上でなければなりません。

dxとdyは派生の順序を表し、0はこの方向に派生がないことを意味します。通常は0、1、2です。

オプションのパラメータは次のとおりです。

dstは説明する必要はありません。

ksizeはソーベル演算子のサイズで、1、3、5、7でなければなりません。

scaleはスケーリング導関数のスケーリング定数であり、デフォルトではスケーリング係数はありません。

deltaは、最後のdstに追加されるオプションの増分です。同様に、追加の値はデフォルトでdstに追加されません。

borderTypeは、画像の境界線を判別するためのモードです。このパラメーターのデフォルト値はcv2.BORDER_DEFAULTです。

次に、実験的な画像を見てみましょう。
ここに画像の説明を挿入

実際のコード:

	view plaincopy to clipboardprint?
import cv2  
import numpy as np  
  
img = cv2.imread("pie.png",0)  
x = cv2.Sobel(img,cv2.CV_16S,1,0)  
  
cv2.imshow("x",x)  
  
cv2.waitKey(0)  
cv2.destroyAllWindows()  

ここに画像の説明を挿入

画像形式のため、出力がないことがわかりましたので、Sobel関数の2番目のパラメーターでcv2.CV_16Sを使用しています。OpenCVドキュメントのSobel演算子の紹介に「8ビットの入力画像の場合は、デリバティブが切り捨てられる」という文があるためです。つまり、微分が計算された後、ソーベル関数は負の値になり、255より大きい値になります。元のイメージは8ビットの符号なし数値であるuint8であるため、Sobelによって作成されたイメージには十分なビットがなく、切り捨てられます。したがって、16ビットの符号付きデータ型、つまりcv2.CV_16Sが使用されます。

処理後、convertScaleAbs()関数を使用して、元のuint8フォームに変換することを忘れないでください。そうでない場合、画像は表示されず、灰色のウィンドウが表示されます。convertScaleAbs()のプロトタイプは次のとおりです。

dst = cv2.convertScaleAbs(src [、dst [、alpha [、beta]]])

オプションのパラメーターalphaは展開係数で、betaは結果に追加される値です。結果はuint8タイプの画像を返します。

Sobelオペレーターは2つの方向で計算されるため、cv2.addWeighted(...)関数を使用して、それらを最終的に組み合わせる必要があります。関数プロトタイプは次のとおりです。

dst = cv2.addWeighted(src1、alpha、src2、beta、gamma [、dst [、dtype]])

もちろん、この関数は以前に説明されているので、ここでは触れません。

もう一度コードを見てみましょう:

	view plaincopy to clipboardprint?
import cv2  
import numpy as np  
  
img = cv2.imread("pie.png",0)  
x = cv2.Sobel(img,cv2.CV_16S,1,0)  
y = cv2.Sobel(img,cv2.CV_16S,0,1)  
absX = cv2.convertScaleAbs(x)  
absY = cv2.convertScaleAbs(y)  
  
dst = cv2.addWeighted(absX,0.5,absY,0.5,0)  
cv2.imshow("x",absX)  
cv2.imshow("y",absY)  
cv2.imshow("res",dst)  
  
cv2.waitKey(0)  
cv2.destroyAllWindows()  

x方向とy方向を個別に見てみましょう。
ここに画像の説明を挿入

最終的な合計を見てみましょう:
ここに画像の説明を挿入

ソーベル演算子はフィルタリング演算子の一種であるため、エッジを抽出するために使用され、高速でたたみ込み関数を使用できます。これは単純で効果的であり、広く使用されています。軟膏のハエは、Sobelオペレーターが画像の本体と背景を厳密に区別しない、つまり、Sobelオペレーターが人間の視覚的および生理学的特性を厳密にシミュレートしないため、抽出された画像の輪郭が十分でない場合があります。

Scharrオペレーター

Scharr()関数は、標準のSobel関数よりも正確な計算結果を提供します。次のコアを使用します。
ここに画像の説明を挿入

たたみ込みカーネルはSobelとは異なりますが、他の点ではSobelと基本的に同じです。関数のプロトタイプを見てみましょう。

dst = cv2.Scharr(src、ddepth、dx、dy [、dst [、ksize [、scale [、delta [、borderType]]]]]))

パラメータはもう導入されておらず、Sobelと完全に一致しています。コードのデモを見てみましょう。

	view plaincopy to clipboardprint?
import cv2  
import numpy as np  
  
img = cv2.imread("pie.png",0)  
x = cv2.Scharr(img,cv2.CV_16S,1,0)  
y = cv2.Scharr(img,cv2.CV_16S,0,1)  
absX = cv2.convertScaleAbs(x)  
absY = cv2.convertScaleAbs(y)  
  
dst = cv2.addWeighted(absX,0.5,absY,0.5,0)  
cv2.imshow("res",dst)  
  
cv2.waitKey(0)  
cv2.destroyAllWindows()  

ここに画像の説明を挿入

このチュートリアルで説明されているSobelオペレーターとScharrオペレーターには、グラフィックスのエッジ検出にいくつかの欠陥があります。

記事の概要ページを確認してくださいhttps://blog.csdn.net/weixin_44237705/article/details/107864965
openvinoの技術情報はグループで交換できます〜
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/weixin_44237705/article/details/108377930