在matlab中不使用for循环计算矩阵的直方图

时间:2012-11-03 18:32:11

标签: matlab image-processing matrix histogram

我有一个我已读入的图像,其像素值存储在矩阵中。我试图获得矩阵的频率表,我打算绘制直方图。我试图只使用矩阵表达式(即没有循环/ imhist函数)。我查看了一个名为histc()的函数,它可以计算矩阵中的值,但我不知道如何使用它。如果有人能指出我正确的方向,我真的很感激。感谢

2 个答案:

答案 0 :(得分:2)

尝试:

hist(image(:),min(image(:)):max(image(:)));

这将绘制像素值的直方图,包括图像具有的整个值范围。

答案 1 :(得分:1)

虽然这是一篇旧帖子,但我们也可以使用accumarray

h = accumarray(double(im(:))+1, 1, [double(intmax(class(im)))+1 1]);

h将包含每个强度级别遇到的像素数的直方图/频率计数。我们将im中的所有值和1的值相加,因为MATLAB将数组从1开始而不是0。图像的强度将从0开始。我们还想指定直方图的大小,从0到我们拥有的这个类所支持的强度。我们可以通过intmax(class(im))找出图像支持的最大强度。因此,我们可以支持的可能强度总数为intmax(class(im)) + 1accumarray的第三个参数指定了直方图的输出大小。

请注意,您需要使用intmax转换im调用以及图像double,因为返回的是类型的最大整数,它是那种类型。因此,添加1将简单地使值饱和而不进行注册。因此,您需要转换为double,以便添加可以正确注册。