我有一个有趣的问题正在尝试解决。例如,如果我们有一张包含两个纹理(A 和 B)的黑白图像,我有兴趣知道完全覆盖各个纹理的边界的像素值。
我想过使用互相关,这会给我图像上模板(图例)的位置集群,但是有没有办法使用它来获取边界的像素值(这些通常是不规则的)?另外,还有其他更好的方法吗?
一个真实的例子是在地图上检测降雨区域,该地图显示一年中的三个降雨水平。每个级别都分配有图例中存在的纹理,用于在同一图像上进行纹理匹配。
我有一个有趣的问题正在尝试解决。例如,如果我们有一张包含两个纹理(A 和 B)的黑白图像,我有兴趣知道完全覆盖各个纹理的边界的像素值。
我想过使用互相关,这会给我图像上模板(图例)的位置集群,但是有没有办法使用它来获取边界的像素值(这些通常是不规则的)?另外,还有其他更好的方法吗?
一个真实的例子是在地图上检测降雨区域,该地图显示一年中的三个降雨水平。每个级别都分配有图例中存在的纹理,用于在同一图像上进行纹理匹配。
这是一个简单的过程:
Law 的纹理测量是一种较旧但仍然有用的技术,用于确定图像中的纹理,它们可能足以让您在整个图像中区分纹理 A 和纹理 B。请参阅维基百科文章中的“法律纹理能量测量”部分:
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 的论文还描述了一种可以快速实现的标准轮廓跟踪算法。
如果您有两个以上的纹理,那么在将纹理重新映射为颜色后,您可以使用分水岭或均值偏移算法将区域聚集在一起。虽然这种从纹理到颜色的重新映射不是必需的,但它确实使该过程更易于调试和理解。