我有一个有趣的问题要解决。因此,例如,如果我们有一个包含两个纹理(A和B)的黑白图像,我想知道完全覆盖各个纹理的边界的像素值。
我考虑过使用互相关,这会给我图像上模板(图例)的位置簇,但是有没有办法使用它来获取边界的像素值(这些通常是不规则的)?另外,还有其他更好的方法吗?
一个真实的例子就是在显示一年中三个降雨水平的地图上检测降雨区域。为每个级别分配了图例中存在的纹理,该纹理用于在同一图像上进行纹理匹配。
我有一个有趣的问题要解决。因此,例如,如果我们有一个包含两个纹理(A和B)的黑白图像,我想知道完全覆盖各个纹理的边界的像素值。
我考虑过使用互相关,这会给我图像上模板(图例)的位置簇,但是有没有办法使用它来获取边界的像素值(这些通常是不规则的)?另外,还有其他更好的方法吗?
一个真实的例子就是在显示一年中三个降雨水平的地图上检测降雨区域。为每个级别分配了图例中存在的纹理,该纹理用于在同一图像上进行纹理匹配。
Answers:
这是一个简单的过程:
Law的纹理量度是用于确定图像纹理的较旧但仍有用的技术,它们可能足以使您在整个图像中将纹理A与纹理B区分开。请参阅Wikipedia文章中的“法律纹理能量度量”部分:
http://en.wikipedia.org/wiki/Image_texture
第一步,计算所有纹理量度并确定哪个特定量度(例如“边缘”或“斑点”)使您可以最轻松地将一个纹理与另一个纹理区分开。(如果发布一些图片,我可以帮助您确定纹理度量。)
如果只有两个纹理A和B,则可以将它们分别作为前景和背景,并且可以使用标准的区域标记算法。为了更容易查看处理中发生的情况,您可以通过将A纹素(纹理元素,少量纹理块)分配给白色,将B纹素分配给黑色,以生成新图像。然后,区域标记和/或轮廓跟踪算法将找到连接的白色和黑色区域。OpenCV中的findContours()函数可以很好地工作。
http://en.wikipedia.org/wiki/Connected-component_labeling
同一篇Wikipedia文章同时包括传统的多遍算法和单遍算法。我还没有实现那里描述的单遍算法,但是我已经使用了Chen和Chang的论文“使用轮廓跟踪技术的组件标记算法”中描述的单遍算法。Chen和Chang的论文还描述了可以快速实现的标准轮廓跟随算法。
如果您有两个以上的纹理,则在将纹理重新映射为颜色之后,可以使用分水岭或均值平移算法将区域聚类在一起。尽管不必从纹理到颜色重新映射,但这确实使该过程更易于调试和理解。