我有一个二进制图像,因此它只有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.
答案 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。