2017-07-13 15 views
1

私はmorphを使用しています。 OpenCVで開き、opencv経由で画像のROI外のノイズを減らしています。今まで、ノイズリダクションが必要なときはいつでも、カーネルサイズを無作為に増やしたり、繰り返し回数を増やしたりすることができます。しかし、あなたがどの状況をどのように変えるかをどのように増やす/決めるのかによって、結果には大きな違いがありますか?私は推測とは別のパラメータを変更する(より多くの方法で)より良いアプローチを考え出しています。モルフォロジー演算(OpenCV)における反復とカーネルサイズ

答えて

2

カーネルの種類によって異なります。奇数平方カーネルを使って膨張または腐食するには、サイズを大きくするか反復を増やすかに違いはありません(等しいとする値を使用すると仮定して)。例:

>>> M = np.zeros((7,7), dtype=np.uint8) 
>>> M[3,3] = 1 

>>> k1 = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3)) 
>>> M1 = cv2.dilate(M, k1, iterations=2) 

>>> k2 = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5)) 
>>> M2 = cv2.dilate(M, k2, iterations=1) 

>>> M1 
[[0 0 0 0 0 0 0] 
[0 1 1 1 1 1 0] 
[0 1 1 1 1 1 0] 
[0 1 1 1 1 1 0] 
[0 1 1 1 1 1 0] 
[0 1 1 1 1 1 0] 
[0 0 0 0 0 0 0]] 

>>> M2 
[[0 0 0 0 0 0 0] 
[0 1 1 1 1 1 0] 
[0 1 1 1 1 1 0] 
[0 1 1 1 1 1 0] 
[0 1 1 1 1 1 0] 
[0 1 1 1 1 1 0] 
[0 0 0 0 0 0 0]] 

これはかなり直感的です。拡張するための長方形のカーネルは、任意の白色画素を見つけ、隣接する画素を白色に変える。したがって、これを2回行うと、1つの白いピクセルが5×5ブロックの白いピクセルに変わることは容易にわかります。ここでは、中央のピクセルが比較されるピクセルであると仮定しています--- アンカー ---これは変更される可能性があり、結果に影響する可能性があります。あなたはそれが形(直感的)を作成しながら、彼らは同じ場所にいないしていることを見ることができます

>>> M = np.zeros((5, 5), dtype=np.uint8) 
>>> M[2,2] = 1 

>>> k1 = cv2.getStructuringElement(cv2.MORPH_RECT, (2, 2)) 
>>> M1 = cv2.dilate(M, k1, iterations=2) 

>>> k2 = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3)) 
>>> M2 = cv2.dilate(M, k2, iterations=1) 

>>> M1 
[[0 0 0 0 0] 
[0 0 0 0 0] 
[0 0 1 1 1] 
[0 0 1 1 1] 
[0 0 1 1 1]] 

>>> M2 
[[0 0 0 0 0] 
[0 1 1 1 0] 
[0 1 1 1 0] 
[0 1 1 1 0] 
[0 0 0 0 0]] 

:たとえば、あなたが(3, 3)カーネルの1回の繰り返しと(2, 2)カーネルの2回の反復を比較したと仮定(非直感的)。カーネルの中央には(2, 2)カーネルのアンカーがありません---この場合、中心にあるピクセルでは、拡大する隣人は右下にしかないことがわかります。これは、方向を選択する必要があるためです1つのピクセルを拡張して(2, 2)の正方形を埋めることしかできないためです。

非長方形カーネルの場合は、さらに複雑になります。たとえば、

>>> M = np.zeros((5, 5), dtype=np.uint8) 
>>> M[2,2] = 1 

>>> k1 = cv2.getStructuringElement(cv2.MORPH_CROSS, (3, 3)) 
>>> M1 = cv2.dilate(M, k1, iterations=2) 

>>> k2 = cv2.getStructuringElement(cv2.MORPH_CROSS, (5, 5)) 
>>> M2 = cv2.dilate(M, k2, iterations=1) 

>>> M1 
[[0 0 1 0 0] 
[0 1 1 1 0] 
[1 1 1 1 1] 
[0 1 1 1 0] 
[0 0 1 0 0]] 

>>> M2 
[[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]] 

M1の最初のパスは、高さ3ピクセル、幅3ピクセルの小さな十字形を作成します。しかし、それらのピクセルのそれぞれは、実際にはダイヤモンドパターンを作成する、その場所に十字を作成します。

したがって、奇数次元の矩形カーネルでは、基本的なモルフォロジー演算を集計すると同じ結果になりますが、他のカーネルでは結果が異なります。他の形態操作をこのような簡単な例に適用すると、それらがどのように動作し、どの操作を使用するべきか、そしてその効果を増やす方法がわかります。

関連する問題