[OpenCV-Python] 17形態変換

OpenCV-Python:OpenCVでのIV画像処理

17形態変化

目標
  •腐食、膨張、開操作、
  閉操作など、さまざまな形態学的操作を学習します。•学習する必要のある関数は、cv2.erode()、cv2.dilate()、cv2.morphologyEx()
などです。

原理
  モルフォロジー演算は、画像の形状に基づいた簡単な演算です。一般に、2値化された画像に対して実行される操作。2つのパラメータを入力する必要があります。1つは元の画像で、もう1つは構造化要素またはカーネルと呼ばれ、操作の性質を決定するために使用されます。2つの基本的な形態学的操作は、腐食と膨張です。それらのバリアントは、開く操作、閉じる操作、グラデーションなどを構成します。例として、次の図で1つずつ紹介します。

img

17.1腐食

土壌侵食と同様に、この操作は前景オブジェクトの境界を腐食します(ただし、前景はまだ白です)。これはどのように行われますか?畳み込みカーネルは画像に沿ってスライドします。畳み込みカーネルに対応する元の画像のすべてのピクセル値が1の場合、中央の要素は元のピクセル値を保持します。それ以外の場合はゼロになります。

これはどのような影響がありますか?畳み込みカーネルのサイズに応じて、前景に近いすべてのピクセルが腐食する(0に変わる)ため、前景オブジェクトが小さくなり、画像全体の白い領域が縮小されます。これは、ホワイトノイズを除去するのに役立ちます。また、相互に接続されている2つのオブジェクトを切断するためにも使用できます。
ここに、すべての値がにある5x5畳み込みカーネルを使用した例があります。彼がどのように機能するか見てみましょう:

import cv2
import numpy as np

img = cv2.imread('j.png',0)
kernel = np.ones((5,5),np.uint8)
erosion = cv2.erode(img,kernel,iterations = 1)

結果:

侵食

17.2拡張

腐食とは異なり、畳み込みカーネルに対応する元の画像のピクセル値の1つが1である限り、中央要素のピクセル値は1です。したがって、この操作により、画像の白い領域(前景)が増加します。一般的に、腐食が最初に使用され、次に膨張がノイズを除去するために使用されます。腐食はホワイトノイズを除去するため、前景のオブジェクトも小さくなります。それで私たちは彼を再び膨らませます。この時点で、ノイズは除去されて戻ってきませんが、前景はまだ増加します。拡張を使用して、2つの別々のオブジェクトを接続することもできます。

dilation = cv2.dilate(img,kernel,iterations = 1)

結果:

img

17.3オープン操作

高度な性質の腐食とその後の膨張は、オープン操作と呼ばれます。上で紹介したように、それはノイズを除去するために使用されます。ここで使用する関数はcv2.morphologyEx()です。

opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)

結果:

オープニング

17.4算術演算を閉じる

最初に展開してから腐食します。これは、前景オブジェクトの小さな穴、または前景オブジェクトの小さな黒いスポットを埋めるためによく使用されます。

closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

結果:

img

17.5形態学的勾配

実際、それは画像の拡大と縮小の違いです。
結果は、前景オブジェクトの輪郭のように見えます。

gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)

結果:

img

17.6シルクハット

元の画像とオープン操作後に取得された画像の違い。次の例は、9x9コアを使用したトップハット操作の結果です。

tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)

結果:

img

17.7ブラックハット

クローズ操作後に得られた画像と元の画像の違い。

tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)

結果:

img

17.8形態学的操作間の関係

参考までに、上記の一元化された形態学的操作間の関係をリストします。

構造化要素
  前の例では、Numpyを使用して正方形の構造化要素を作成しました。ただし、楕円形/円形のコアを作成する必要がある場合もあります。この要件を達成するために、OpenCV関数cv2.getStructuringElement()が提供されています。必要な核の形と大きさを彼に伝える必要があります。

# Rectangular Kernel
>>> cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))
array([[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]], dtype=uint8)
# Elliptical Kernel
>>> cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
array([[0, 0, 1, 0, 0],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[0, 0, 1, 0, 0]], dtype=uint8)
# Cross-shaped Kernel
>>> cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5))
array([[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[1, 1, 1, 1, 1],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0]], dtype=uint8)

詳細については、公式アカウントに注意してください。
img

おすすめ

転載: blog.csdn.net/yegeli/article/details/113421033