对于这张特定的图片,有几种方法可以解决部分问题。如果你将几种方法结合起来,并为用户提供交互选择,你可以在相对短的时间内开发出一个很好的软件。我会使用它!
你和Misha已经讨论了前两个项目:
1. 使用Canny或其他方法进行边缘检测。我建议你应该处理“原始”的边缘强度图像,而不是将边缘强度阈值化以生成二值化图像。请注意,在这种情况下,图像处于锐利焦点状态,大部分背景都未能聚焦。虽然这不是一般解决方案,但对于这张特定的图片,您可以过滤掉以下边缘:(a)属于线条(使用Hough或RANSAC)但(b)梯度低于阈值陡峭度。
2. 洪水填充。Misha已经提供了链接。填充“静态”值不应该太难实现(例如,填充所有与点击像素的值+/- N相邻的像素)。实现动态洪水填充,考虑到光照和3D曲率的梯度,就有些困难了!
3. 均值漂移聚类。这可能甚至可以作为第一步,帮助将HSV值相同的像素聚集在一起。不过,仅凭肉眼观察图像,前景图案的色调和大部分背景的色调相似。OpenCV有一个均值漂移的实现。这里有一个相关的CAMSHIFT算法工作视频:
http://www.youtube.com/watch?v=iBOlbs8i7Og
4. 对于强边缘进行边缘跟踪。如果用户靠近边缘点击,您可以识别最近的强边缘,然后使用轮廓跟踪(或“轮廓追踪”)算法。基本的轮廓跟踪算法适用于二进制图像;你可以将你的算法改为尝试在RGB空间中跟随强边缘。棘手!
5. 由于你正在为用户编写软件,请把一些时间花在软件易用性上,而不仅仅是试图解决一般的图像处理问题。
6. 检查背景曲线的遮挡。确定一个物品是否属于背景的另一种方法是确定它是否被前景对象遮挡。如果你发现两条共线且梯度缓和(即它们不聚焦),那么它们可能是两条线段而不是一条,因为它们被前景物体遮挡。
7. 如果你有机会使用相机而不是现有的图像,你可以模仿“光场”或全景相机(如Lytro
https://www.lytro.com/camera)通过在不同的焦距设置下连续拍摄多个图像。这可以帮助您基于梯度变化识别不同深度的图案。如果雕像离相机比较近,当相机对准无限远时,它将失去焦点。
提高易用性
假设您可以将图像分成合理区块,请提示用户单击属于同一感兴趣对象的区块。每个区块都可以拥有自己的调整参数,例如边缘强度、颜色接受范围等。区块特定参数可以帮助软件即使在阴影、不同照明等情况下仍可用于分割。类似的功能可以在GIMP和Photoshop中通过组合选择来完成,但它们的可用性还不够。
对于已经识别出来的区块,请实现“贴边”功能,以帮助用户将发现的边缘曲线移动到真正的边缘曲线上。如果用户抓住一个区块轮廓并向一个方向拖动,轮廓可以贴附到该方向的下一个强边缘上。
提供批量处理选项。如果用户有一系列在相同条件下拍摄的照片,则用户选择的第一张图像的区块可以帮助指导软件设置后续图像的参数。这并不是为了解决一般的分割问题,但可能会为某些图像组节省用户的时间和精力。
这是一个有趣的问题。祝你好运!