第 3 章 - OpenCV の基礎 - 7 - 形態論

正面

形態学は主に画像からコンポーネント情報を抽出します。コンポーネント情報は、通常、画像の理解に使用される最も重要な形状特徴であり、画像の形状を表現および説明する上で非常に重要です。

一般的には、一連の操作によって画像情報の中の重要な情報をより目立たせることを指します。同時に、形態学的操作はすべてグレースケール画像に基づいています。

関連する操作の 2 つの主なタイプは腐食/拡張であり、次に包括的な操作 (オープニング操作/クローズ操作/形態的勾配/トップ ハット/ブラック ハットなど) が続きます。

腐食

エロージョンは最も基本的な形態学的操作の 1 つで、画像の境界点を削除し、画像を境界に沿って内側に縮小させ、指定された構造要素より小さい部分を削除できます。

したがって、腐食により、外部ノイズの一部を除去したり、素子を分割したりする機能が実現されます。

腐食原理の説明:

構造要素:中心位置と一定の範囲を持った構造であり、平たく言えば二次元配列です。

スキャンされた画像の各ピクセルについて、構造要素はスキャンされた点と一致し、構造要素要素とカバーされたバイナリ画像の「AND」演算が実行されます。両方が 1 の場合、画像のピクセル値は変更されません。それ以外の場合は 0 に変更されます。

回路図は以下の通りです:

画像 a が元の画像、画像 b が構造要素です。2 行目をスキャンすると、1 行目の 2/3/4 列のデータは 0 になるため、腐食後は 2/3/ 2行目4列 1がすべて0になり、4行目も同様です。

3 行目の 2/3/4 列がスキャンされると、それらはすべて 1 であるため、3 行目の 2/3/4 列はそれぞれ変更されず、最終結果は図 d に示されます。

関数構文の説明: dst = cv2.erode( src、カーネル、アンカー、反復、borderType、borderValue)

  • kernel : 腐食で使用される構造は、それ自体で、または 2 次元配列空間である cv2.getStructuringElement() を通じて生成できます。
  • アンカー : アンカーの位置、デフォルトは (-1,-1)、カーネルの中心
  • iterations : 腐食操作の反復数。デフォルトは 1 で、腐食操作は 1 つだけ実行されます。
  • borderType : 境界線の処理方法。通常はデフォルトの BORDER_CONSTANT が採用されます。
  • borderValue : 境界線のパディング値。通常はデフォルト値を使用します。

そのため、多くの場合、 dst = cv2.erode( src , kernel ) に簡略化されます。

プログラム例は以下のとおりです。

import cv2 as cv
import numpy as np

origin = cv.imread("erode.bmp")
# 使用了一个3*3的结构元,结构元面积越大,腐蚀的越厉害,结果图就越小
kernel_3 = np.ones((3, 3), np.uint8)

# 不大明显,但有些触角已经变短了
erode_3 = cv.erode(origin, kernel_3)
# 反复刷了三次,图像进一步腐蚀减小,边角已经腐蚀掉了
erode_3_3 = cv.erode(origin, kernel_3, iterations=3)

cv.imshow("origin", origin)
cv.imshow("erode_3", erode_3)
cv.imshow("erode_3_3", erode_3_3)

cv.waitKey()
cv.destroyAllWindows()

操作の結果は次のようになります。

 拡大

拡張操作も形態学の基本操作であり、拡張と収縮の効果は逆であり、拡張操作により境界を拡張することができます。拡張操作は、2 つの近いオブジェクトを接続することができ、また、塗りつぶしにも役立ちます。

画像セグメンテーション後の画像内の空白スペース。

拡張原理の説明:

構造要素を使用して画像内の各ピクセルをスキャンします。構造要素とスキャン点が一致します。構造要素要素とカバーされたバイナリ画像を使用して「AND」演算を実行します。両方が 0 の場合、画像のピクセル値は次のようになります。 0、そうでない場合は 1 に変更され、ピクチャの端の位置が構造要素にぴったりと続いて拡張されます。

関数構文の説明: dst = cv2.dilate( src 、カーネル、アンカー、反復、borderType、borderValue)

関数パラメータは腐食パラメータとまったく同じなので、あまり説明する必要はありません。このメソッドは dst = cv2.dilate(src, kernel) のように簡略化できます。

プログラム例は以下のとおりです。

import cv2 as cv
import numpy as np

origin = cv.imread("dilation.png")
# 使用了一个3*3的结构元,结构元面积越大,膨胀的越厉害,结果图就越大
kernel = np.ones((3, 3), np.uint8)
erode_3 = cv.dilate(origin, kernel)
# 连续膨胀3次
erode_3_3 = cv.dilate(origin, kernel, iterations=9)
cv.imshow("origin", origin)
cv.imshow("dilation_3", erode_3)
cv.imshow("dilation_3_3", erode_3_3)

cv.waitKey()
cv.destroyAllWindows()

次のように実行します。

 

オープン操作

オープニング操作は、最初に収縮操作を実行し、次に拡張操作を実行します。侵食操作では、画像内のターゲットの外側のノイズを除去し、拡張後にターゲットのサイズを復元できます。

関数構文の説明: dst = cv2.morphologyEx( src, cv2.MORPH_OPEN, kernel)

src、dstはそれぞれ元の画像と処理結果の画像です

cv2.MORPH_OPEN : オープン操作のフラグ

kernel : 操作で使用される構造要素

手順は次のとおりです。

import cv2 as cv
import numpy as np

origin = cv.imread("open_pic.png", 0)
kernel = np.ones((5, 5), np.uint8)
open_pic = cv.morphologyEx(origin, cv.MORPH_OPEN, kernel) # 开运算
cv.imshow("origin", origin)
cv.imshow("open", open_pic)

cv.waitKey()
cv.destroyAllWindows()

次のように実行します。

 

閉じる操作

クロージング操作では、最初に拡張操作を実行し、次に侵食操作を実行します。これは主に、画像内の重要な情報に小さな穴があり、膨張操作によってその小さな穴が埋められるシナリオを対象としています。

関数構文の説明: dst = cv2.morphologyEx( src, cv2.MORPH_CLOSE, kernel)

クローズ操作とオープン操作は同じ関数を使用し、異なる識別子を通じて異なる操作を実現するだけです。

cv2.MORPH_OPEN : クローズ操作のフラグ

手順は次のとおりです。

import cv2 as cv
import numpy as np

origin = cv.imread("close_pic.png", 0)
kernel = np.ones((5, 5), np.uint8)
open_pic = cv.morphologyEx(origin, cv.MORPH_CLOSE, kernel) # 闭运算
cv.imshow("origin", origin)
cv.imshow("open", open_pic)

cv.waitKey()
cv.destroyAllWindows()

操作の結果は次のようになります。

 

形態学的勾配

実際、これは、前景オブジェクトの輪郭のように見える画像の拡大と侵食の違いです。

関数構文の説明: dst = cv2.morphologyEx( src, cv2.MORPH_GRADIENT, kernel)

機能は開閉操作と同じで、スタイルが異なるだけです。

cv2.MORPH_GRADIENT : 形態学的勾配のキーワード

手順は次のとおりです。

import cv2 as cv
import numpy as np

origin = cv.imread("abcdefg.png")
kernel = np.ones((5, 5), np.uint8)
open_pic = cv.morphologyEx(origin, cv.MORPH_GRADIENT, kernel)  # 形态学梯度
cv.imshow("origin", origin)
cv.imshow("gradient", open_pic)

cv.waitKey()
cv.destroyAllWindows()

レンダリングは次のとおりです。

 

トップハット

オープニング操作は、最初に腐食し、次に拡張することで画像のノイズを除去します。トップハットは、元の画像とオープニング操作後に得られる画像の差、つまり除去されたノイズです。

関数構文の説明: dst = cv2.morphologyEx( src, cv2.MORPH_TOPHAT, kernel)

import cv2 as cv
import numpy as np

origin = cv.imread("open_pic.png")
kernel = np.ones((5, 5), np.uint8)
open_pic = cv.morphologyEx(origin, cv.MORPH_TOPHAT, kernel)  # 礼帽
cv.imshow("origin", origin)
cv.imshow("tophat", open_pic)

cv.waitKey()
cv.destroyAllWindows()

次のように実行します。

 

黒い帽子

閉鎖操作は、最初に膨張し、次に腐食することで、内部の小さな穴を埋める機能があります。ブラックハットは、閉鎖操作によって得られた画像と元の画像の差分であるため、小さな穴が埋められた画像は、前が表示されます。

関数構文の説明: dst = cv2.morphologyEx( src, cv2.MORPH_BLACKHAT, kernel)

手順は次のとおりです。

import cv2 as cv
import numpy as np

origin = cv.imread("close_pic.png")
kernel = np.ones((5, 5), np.uint8)
open_pic = cv.morphologyEx(origin, cv.MORPH_BLACKHAT, kernel)  # 黑帽
cv.imshow("origin", origin)
cv.imshow("blackhat", open_pic)

cv.waitKey()
cv.destroyAllWindows()

次のように実行します。

 

 

おすすめ

転載: blog.csdn.net/sunguanyong/article/details/129281995