2017-07-13 43 views
1

我一直在使用变形大小。在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]] 

这很直观。 A 3x3用于扩张的矩形内核将查找任何白色像素,并将相邻像素变为白色。所以很容易看到,这样做两次会使任何一个白色像素变成一个5x5的白色像素块。这里我们假设中心像素是比较的一个--- ---但是这可以改变,这可能会影响结果。例如,假设你是一个比较核心(2, 2)的两次迭代与(3, 3)内核的单次迭代:

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

你可以看到,虽然它创建形状(直觉),他们并不在同一个地方(非直观)。那是因为一个(2, 2)内核的锚不能在内核的中心---在这种情况下,我们看到,居中像素,即扩张的邻居都在右下角,因为它必须选择一个方向因为它只能扩展单个像素来填充一个(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个像素宽。但是,那些像素中的每一个都会在它们的位置创建一个十字,这实际上会创建一个菱形图案。

因此归结起来基本形态学运算,具有矩形仁,至少奇数尺寸的,结果是相同的---但对于其他的内核,其结果是不同的。您可以将其他形态学操作应用于这样的简单示例,以了解它们的行为方式以及应该使用的方式以及如何增加其效果。