【问题标题】:Calculating the histogram of a matrix without using a for loop in matlab在matlab中不使用for循环计算矩阵的直方图
【发布时间】:2012-11-03 18:32:10
【问题描述】:

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

【问题讨论】:

  • im = imread('path/to/imagefile');如果是灰度,那么你可以简单地向量化它并使用figure;hist(im(:));
  • 为什么不能使用imhist?您可以打开该函数的代码,并研究它是如何完成的。

标签: matlab image-processing matrix histogram


【解决方案1】:

尝试:

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

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

【讨论】:

    【解决方案2】:

    虽然这是一个老帖子,但我们也可以使用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 调用以及图像imdouble 一起转换,因为返回的是该类型的最大整数它属于该类型。因此,加 1 只会使值饱和而不是注册。因此,您需要转换为double,以便添加可以正确注册。

    【讨论】:

    • 我有一个关于 intmax(class(im)) 的问题,其中 im 是 'uint8'。出于某种原因 intmax('uint8') + 1 总是给出 255。想法?
    • 我必须这样做 -> h = accumarray(img(:) + 1, 1, [256 1]);我相信您需要检查类型并选择下一个最大的。
    • @CameronLowellPalmer 是的,因为返回的是该类型的最大值的整数......并且也是同一类型。所以加1会饱和,没有效果。您需要将其转换为 double 才能正常工作。感谢您发现错误。因此,将double() 包裹在intmax 调用周围。我会尽快更新我的帖子。
    • 还有一件事... h = accumarray(uint16(img(:)) + 1, 1, [256 1]);似乎 uint8 的问题非常令人讨厌。 Matlab 在字体部门似乎很老派。
    • @CameronLowellPalmer - 我知道。我已经编辑了帖子。我会做double 以使其与您使用的任何图像类型兼容。 double 是默认精度,因此它可以处理任何位精度的图像。
    猜你喜欢
    • 2015-02-20
    • 2013-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多