回答
尝试使用锐化滤波器精明的轮廓检测器之前,以突出的边缘。
根据我的经验,Canny边缘检测算法通常会在用于处理低分辨率图像时留下这些类型的伪像。尽管听起来很奇怪,但通过简单地增加图像的大小(例如,使用双线性插值),您通常可以获得更好的结果。我不确定你使用的是什么工具,但在OpenCV中,这可以使用简单的resize函数来完成。通过4倍增加的宽度和高度,我可以得到下面的边界:
当然,如果你仔细观察,你还是会看到一些小的差距。解决它的一个可能的解决方案是使用morphological transformations。例如,如果我用上面的图像上的形态关闭操作,这将有助于连接缝隙:
值得一提的是,由于您的边缘图像看起来是白色背景上的黑边,你会可能需要使用形态打开操作。
此外,请注意,Canny操作的低阈值也可能对解决某些情况下看到的各种间隙有一些影响。在尝试更昂贵的计算方法之前,应该尝试降低低阈值以查看是否可以避开缺失的边缘。
Hi @ Aenimated1 你的方法运作良好。我遵循的步骤如下: gray = cv2.imread('image.tif',0) big = cv2.resize(gray,(4 * gray.shape [0],4 * gray.shape [1] )) edges = cv2.Canny(big,5,10) w,h = edges.shape r = 500.0/h dim =(500,int(w * r)) small = cv2.resize(edges ,暗淡,插值= cv2.INTER_AREA) 小=〜小 小[小<250] = 0 io.imsave( 'small2.tif',小) 现在,我得到了我想要,谢谢,海梅 –
很高兴它解决了。鉴于您的输入图像的性质,它可能也值得考虑一个更简单的算法。基本上,您需要的只是在输入图像具有不同值的相邻像素的任何位置绘制边缘。我不确定是否有任何OpenCV函数支持该功能,但编写起来很容易,速度也会提高几个数量级。 – Aenimated1
嘿@Aenimated1,我没有这么想,这种新方法非常简单快捷。我也会试一试。您的想法将永远受欢迎。有人认为这个盒子有问题。 –
- 1. Canny边缘检测器C
- 2. Canny边缘VS骨架化
- 3. 获取边缘检测后的边缘坐标(Canny)
- 4. OpenCV的Canny边缘检测C++
- 5. java中的canny边缘检测器
- 6. Android的Canny边缘检测器
- 7. MATLAB中的Canny边缘检测器
- 8. 链接边缘段
- 9. 方向性Canny边缘检测
- 10. OpenCV从Canny边缘到轮廓
- 11. Canny边缘检测器检测到所述图像的边界
- 12. 图像分割与边缘检测
- 13. 树中的边缘切割
- 14. 在Canny边缘算法中只需要一条边线
- 15. Java MaxFlow算法,产生边缘故障
- 16. Android的Canny边缘检测器 - 递归函数的StackOverflow
- 17. 覆盖在图像上的canny边缘黑色
- 18. Canny边缘检测器 - 执行中的问题
- 19. 使用canny方法在一定程度上的边缘检测
- 20. Matlab的Canny边缘功能不能正常工作
- 21. 破碎的图像边缘与canny运算符
- 22. d3:使用鼠标点击链接的分层边缘绑定
- 23. 如何在Java中实现Canny边缘检测器和android studio
- 24. 在页面的边缘/边上的半圆链接
- 25. 正在放弃边缘财产预期放弃其边缘?
- 26. 的Java Swing:Graphics2D的旋转产生恶心边缘
- 27. 图切割,切割至少一半的边缘
- 28. 边框在自定义椭圆上的边缘切割
- 29. 检测边缘(连接的边缘)并查找边缘长度和连接的组件回转半径
- 30. 在Opencv中使用Canny边缘检测识别图像中的文本
欢迎来到Stack Overflow!虽然这可能会在理论上回答这个问题,[这将是更可取的](// meta.stackoverflow.com/q/8259)在这里包括答案的基本部分,并提供参考链接。 – manetsus
Hi @ kalyf-abdalla,感谢您的建议,但我必须说我的图像不是一个通常的灰度图像,我的意思是,这是一个图像,每个区域都有一个特定的灰度级(内部没有可变性),所以我认为应用锐化对我来说没有帮助,因为界限非常明确。我希望你能理解我的观点,谢谢Jaime –