在2D平面中计算b / w形状的大小

时间:2014-01-20 09:27:39

标签: c++ algorithm opencv size

我想计算图片中任意形状的黑色像素数。可能有几个对象,如底部的图片。

我怀疑这个问题可以通过动态编程解决,即逐行遍历像素并添加黑色像素。我只是不知道如何正确统一两个部分的大小。

我很确定有哪些算法可以解决我的问题,但我显然使用了错误的搜索词。

请你为我提供一个好的(快速)算法,如果算法是用c ++编写的,并且与OpenCV库中的Mat兼容,可以给予奖励积分。 ;)

Example Image

此(缩放)图片的结果类似于:左上角为15,大斑点为60,...

3 个答案:

答案 0 :(得分:1)

我想我找到了一个解决方案(显然更好的解决方案!):

将大小计算整合到Connected Component Algorithm

在Connected Component算法中,我们生成一个新的Image,其中有标签(数字)而不是黑色像素。一个区域的所有像素都具有相同的标签。

CC-Algo的新功能是一个表格,其中存储了每个标签的总像素数。这样我知道每个连接组件的大小都是正确的。

Process the image from left to right, top to bottom:
1.) If the next pixel to process is white:
    do nothing
2.) If the next pixel to process is black:
    i.) If only one of its neighbors (top or left) is black, copy its label and +1 in the size table for that label.
    ii.) If both are black and have the same label, copy it and +1 in the size table for that label.
    iii.) If they have different labels Copy the label from the left. Update the equivalence table and +1 in the size table for the left label.
iv.) Otherwise, assign a new label and update the size table with that label and value 1.

• Re-label with the smallest of equivalent labels and update size table accordingly

答案 1 :(得分:1)

问题可以通过以下方式使用洪水填充来解决: -

  
      
  1. 保持2-D布尔数组以跟踪最初设置为false的像素是否已被访问
  2.   
  3. 逐像素扫描图像。
  4.   
  5. 如果像素未被访问且黑色则应用洪水填充,
  6.   
  7. 在洪水填充计数期间,呼叫次数也标记访问过的像素,因为它们是连接的像素数。
  8.   
  9. 遇到白色像素时终止填充。
  10.   
  11. Count是包含像素的区域的大小。
  12.   

Flood Fill

答案 2 :(得分:0)

如果我不熟悉,在像你的样本一样的图像中,你希望你的alogirthm为每个黑色形状返回6个值。并且,每个值都是黑色像素的数量。

我将使用的算法如下:

  1. 反转图像的像素颜色(现在,您正在寻找白色像素)
  2. 您图片中的
  3. Find contours。别忘了只找到EXTERNAL Countours。
  4. 找到的每个轮廓: Draw each contour在像素值为1的小型cv :: Mat中,然后计算此图像的moment of order 0。 0阶的时刻将是形状中的像素数。