[再現] OpenCV-Pythonシリーズのシルクハットとブラックハットの操作(22)

前のチュートリアルでは、いくつかの問題を残しました。つまり、画像の開閉操作後に輝度が変化し、後の画像処理で問題が発生するため、このチュートリアルではシルクハットとOpenCVを紹介しますこれらの問題を解決するためのブラックハットコンピューティング。

トップハット

シルクハットの計算は、しばしば「シルクハット」の計算に変換されます。元の画像と上で紹介した「開く操作」の結果画像の違いは、数式は次のとおりです。ここに画像の説明を挿入

開いた操作の結果は、亀裂または局所的な低輝度領域を拡大するため、開いた操作後の画像は元の画像から差し引かれ、結果の効果画像は元の画像の周囲の領域より明るい領域を強調します。この操作は、選択したコアのサイズに関連しています。

キャップ操作は、隣接するパッチよりも明るいパッチを分離するためによく使用されます。画像に大きな背景があり、小さなオブジェクトがより規則的である場合、シルクハット計算を使用して背景を抽出できます。

それでは、実際の操作をいくつか実行してみましょう。まず、写真を見てみましょう。
ここに画像の説明を挿入

これは、カードの後のデジタル認識について説明する実用的なケースです。最初に、画像をグレースケールにしてからしきい値処理する必要があるため、後で輪郭を抽出するのに便利です。最初にOTSUを使用しましょう。アルゴリズムにはしきい値があります。

	view plaincopy to clipboardprint?
import cv2  
import numpy as np  
  
  
img = cv2.imread('credit_card_.png')  
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)  
threshold = cv2.threshold(gray,0,255,cv2.THRESH_BINARY_INV|  
                          cv2.THRESH_OTSU)[1]  
cv2.imshow("img",img)  
cv2.imshow("thres",threshold)  
cv2.waitKey(0)  
cv2.destroyAllWindows()  

ここに画像の説明を挿入

実際のところ、状況は非常に悪いです。このようなしきい値処理では、次の手順に進むことができません。元の画像を見ると、右下隅のフォントと背景の明るさが少し高いため、この状況が発生します。ここで、フォントを背景から分離したいと思います。さあ、トップハット演算を使って前景を明るくすることができます:

	view plaincopy to clipboardprint?
import cv2  
import numpy as np  
  
  
img = cv2.imread('credit_card_.png')  
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)  
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(21,21))  
tophat = cv2.morphologyEx(gray,cv2.MORPH_TOPHAT,kernel)  
threshold = cv2.threshold(gray,0,255,cv2.THRESH_BINARY_INV|  
                          cv2.THRESH_OTSU)[1]  
cv2.imshow("img",img)  
cv2.imshow("thres",threshold)  
cv2.waitKey(0)  
cv2.destroyAllWindows()  

ここに画像の説明を挿入

この効果がはるかに良いかどうか見てみましょうか?真ん中のデジタルフォントは完全に分離されており、実際、多くの場所でシルクハット演算を使用しています。

黒い帽子

ブラックハット演算は、「クローズドオペレーション」の結果イメージと元のイメージの違いです。数式は次のとおりです。
ここに画像の説明を挿入

ブラックハット操作後のエフェクトイメージは、元のイメージアウトラインの周囲の領域よりも暗い領域を強調表示します。この操作は、選択したコアのサイズに関連しています。したがって、ブラックハット演算は、隣接するポイントよりも暗いパッチを分離するために使用されます。非常に完璧な輪郭レンダリング、サンプルコードも見てみましょう:

view plaincopy to clipboardprint?
import cv2  
import numpy as np  
  
  
img = cv2.imread('close.jpg')  
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)  
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))  
tophat = cv2.morphologyEx(gray,cv2.MORPH_BLACKHAT,kernel)  
cv2.imshow("img",img)  
cv2.imshow("thres",tophat)  
cv2.waitKey(0)  
cv2.destroyAllWindows()  

ここに画像の説明を挿入

形態学的勾配

OpenCV形態学的処理-形態学的勾配の最後の操作を見てみましょう。これは、本質的に画像のエッジ抽出であり、これは、拡張の結果から腐食の結果を引いたものとも言えます。実際の効果を見てみましょう。

view plaincopy to clipboardprint?
import cv2  
import numpy as np  
  
  
img = cv2.imread('close.jpg')  
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)  
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))  
tophat = cv2.morphologyEx(gray,cv2.MORPH_GRADIENT,kernel)  
cv2.imshow("img",img)  
cv2.imshow("thres",tophat)  
cv2.waitKey(0)  
cv2.destroyAllWindows()  

ここに画像の説明を挿入

画像のエッジを検出します。

このチュートリアルの終わりは、OpenCVの形態素処理部分の終わりも意味します。実際、これらはすべて関数APIで呼び出すことができることがわかりました。

cv2。morphologyEx()

前のセクションですでに紹介しましたが、要約すると、これらの操作を合計で実行できます。

(1)MORPH_OPEN:オープン操作

(2)MORPH_CLOSE:閉じた操作

(3)MORPH_GRADIENT:形態学的勾配

(4)MORPH_TOPHAT:トップハット

(5)MORPH_BLACKHAT:黒い帽子

(6)MORPH_ERODE:腐食

(7)MORPH_DILATE:拡張

画像形態の処理は非常に重要であり、誰もがそれに精通している必要があります。

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

おすすめ

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