我一直在使用变形大小。在OpenCV中开放,通过opencv减少图像ROI之外的噪声,直到现在,无论何时我需要更高程度的降噪,我只是随机增加内核大小或增加迭代次数,直到我开心。但是,结果取决于你增加/你将如何决定在特定情况下改变哪个结果有显着差异?我试图想出一个更好的方法来改变参数(除了猜测和检查之外)。迭代与内核的形态学(OpenCV的)
1
A
回答
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个像素宽。但是,那些像素中的每一个都会在它们的位置创建一个十字,这实际上会创建一个菱形图案。
因此归结起来基本形态学运算,具有矩形仁,至少奇数尺寸的,结果是相同的---但对于其他的内核,其结果是不同的。您可以将其他形态学操作应用于这样的简单示例,以了解它们的行为方式以及应该使用的方式以及如何增加其效果。
相关问题
- 1. 内存从迭代Opencv帧泄漏
- 2. 带内核的OpenCV Filter2D iPhone
- 3. 增加迭代时内核崩溃
- 4. 将结果迭代回OpenCL内核
- 5. 使用opencv查找等效的imagemagick形态学命令Python
- 6. 形态学骨架 - scikit-image,pymorph,OpenCV-Python之间的差异?
- 7. 核心转储时迭代迭代
- 8. 学习Linux内核
- 9. 学习核心图形
- 10. OpenCV卷积内核大小
- 11. 迭代有形的VisualStudioHelper类
- 12. OpenCV的“载体迭代不相容”
- 13. python中的梯形内核
- 14. 调用Cuda内核中的Opencv函数
- 15. Android的光学流程与opencv
- 16. SVM在OpenCV中:低精度的OCR与RBF内核
- 17. opencv/javacv:如何迭代轮廓以进行形状识别?
- 18. GDB的Python:如何通过内核链表迭代结构
- 19. 初学Javascript的问题....迭代数组
- 20. r中的动态迭代
- 21. Struts2的迭代与JavaBean的
- 22. Jquery与Request.form动态文本框迭代
- 23. 优化iOS中的形态操作OpenCV
- 24. 迭代内容的JavaScript
- 25. 的JavaScript内JSTL迭代
- 26. 迭代concurrent_hash_map的内容
- 27. 在另一次迭代内迭代?
- 28. openCV检测轮廓内的形状
- 29. syslogd的内核:代码:
- 30. 与Linq迭代