如何计算图像中使用的填充值的总像素数(填充图像)?

时间:2015-01-02 10:14:00

标签: matlab image-processing pixel

我有一个二进制图像,因此它只有2个值,如0和1.之后,我将其转换为不同值的填充图像,就像图像将具有曲线形状。我拿了一个3×3矩阵的值,如果我得到曲线形状,那么我用1或任何数字填充图像。我使用15种不同类型的形状值,如连接点,终点等。

之后,我给出值1到15 - 或根据其形状给出适当的数字。因此,我得到的图像如下:

0 0 0 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0 1 1 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0

我想计算图像中有多少1,然后是2s,3s等,最多15个。例如, 如图所示,如果填充数为5,则总像素数为3.如果填充数为1,则总像素数为6.

2 个答案:

答案 0 :(得分:0)

使用histc

>> im = [ 0 0 0 0 0 0 0 0 0 0 5 0 0 0 0 0
          0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
          0 5 0 0 0 0 0 0 0 1 1 1 0 0 0 0
          0 0 0 0 0 0 0 0 0 0 5 0 0 0 0 0
          0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
          0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 ]; %// data
>> values = 1:15; %// possible values
>> count = histc(im(:), values)
count =
     6 %// number of 1's
     0 %// number of 2's, etc
     0
     0
     3
     0
     0
     0
     0
     0
     0
     0
     0
     0
     0

或使用bsxfun手动计算:

>> count = sum(bsxfun(@eq, im(:), values(:).'), 1)
>> count =
     6     0     0     0     3     0     0     0     0     0     0     0     0     0     0

答案 1 :(得分:0)

我还建议使用accumarray

im = [0 0 0 0 0 0 0 0 0 0 5 0 0 0 0 0
      0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
      0 5 0 0 0 0 0 0 0 1 1 1 0 0 0 0
      0 0 0 0 0 0 0 0 0 0 5 0 0 0 0 0
      0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
      0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 ]; %// data - borrowed from Luis Mendo

counts = accumarray(im(:) + 1, 1);
counts(1) = []

counts =

     6
     0
     0
     0
     3

注意我们必须偏移1,因为accumarray开始将输出数组索引为1.因为你想忽略0,我只需取counts结果并删除第一个条目。这个结果与你所寻求的一致。第一个元素是我们遇到了多少1,即6。最后一个元素是你遇到了多少5个,这是3.因为5是图像中遇到的最大数字,我们可以说5之后的所有符号( 6,7,8,...,15)的计数为0。