对于binary image,我感兴趣的是一种有效计算图像中存在的单个形状数量的方法。另外,作为一个相邻的问题,如何将图像中存在的每个形状都放在正方形中?
非常欢迎伪代码。
答案 0 :(得分:6)
我不能回答下半场,但如果前半部分将“形状”定义为某种颜色的连续像素,这就是我的工作。维护整个图像的数组,指示哪些像素已被“看到”。 (一个bool [,]会用C#-speak来解决这个问题。)
然后开始迭代每个像素。如果已经看过,请跳过它。
否则,如果尚未看到并且它是“非形状”颜色,请标记它并继续前进。
否则,它没有被看到并且是一个形状。从这里开始,四个指南针中的每个方向都有蜘蛛。如果到达看到的像素,请停止并返回(这可以防止发生无限循环)。如果像素是非形状颜色,请标记看到的像素并立即停止。否则,像素是形状颜色。标记它并将其添加到您正在构建的任何“形状定义”数据中。
此过程完成后,您发现了一个形状。将它存放在某处,然后继续搜索。现在应该标记该形状中的所有像素,并且算法将不再考虑这些像素。
一旦定位了形状颜色像素,这种形状发现算法本质上是递归的,并且对于大型形状可能会溢出堆栈。使用基于堆的堆栈实现来执行整个形状搜索可能是合适的。
(如果你认为对角相邻的像素足以将两个形状连接成一个,只需搜索所有八个相邻的像素,而不只是搜索四个水平和垂直相邻的像素。)
答案 1 :(得分:3)
“形状”的一个可能概念是连接组件。在这种情况下,union-find算法会让您想要:http://en.wikipedia.org/wiki/Connected_Component_Labeling。如果您还需要X和Y范围,可以扩展union-find以跟踪这些范围。
答案 2 :(得分:3)
对图像数据进行Blobing,您将获得具有所有像素和范围的每个形状[形状的RECT]
如果您的图像具有形状内部形状,则blobing将两者视为单独的形状。
如果您需要代码发送邮件,将很乐意分享。