【问题标题】:Difference between hist and imhist in matlabmatlab中hist和imhist的区别
【发布时间】:2012-10-01 15:38:16
【问题描述】:

Matlab 中的histimhist 函数有什么区别?我有一个使用imread 从图像加载的颜色级别值矩阵,需要使用直方图计算图像的熵值。
当使用imhist 时,生成的矩阵在所有位置都包含零,除了最后一个(右下角)包含一些高值数字(几千左右)。 因为该输出似乎是错误的,所以我尝试使用 hist 而不是 imhist 并且结果值要好得多,矩阵用看起来正确的值而不是零来实现。
但是,根据文档,imhist 在这种情况下应该更好,hist 应该给出奇怪的结果..
不幸的是,我不擅长 Matlab,所以我无法为您提供更好的问题描述。不过,我以后可以添加一些其他信息。

所以我会尝试更好地解释我的问题..我有一个图像,我应该计算熵和其他一些值(保存该图像需要多少字节,..)。我写了这个函数,效果很好

 function [entropy, bytes_image, bytes_coding] = entropy_single_pixels(im)

im = double(im);

histg = hist(im);

histg(histg==0) = [];
nzhist = histg ./ numel(im);
entropy = -sum(nzhist.*log2(nzhist));

bytes_image = (entropy*(numel(im))/8);

bytes_coding = 2*numel(unique(im));

fprintf('ENTROPY_VALUE:%s\n',num2str(entropy));
fprintf('BYTES_IMAGE:%s\n',num2str(bytes_image));
fprintf('BYTES_CODING:%s\n',num2str(bytes_coding));
end

然后我必须计算相同的值,但我必须从彼此下方的像素中进行“配对”。所以我只有一半的行和相同的列数。我需要将每个唯一的像素对表示为不同的数字,因此我将第一个像素对乘以 1000 并将第二个像素对添加到其中...随后我需要实际应用与第一个示例相同的函数,但这就是时间,当我从 imhist 函数中得到奇怪的数字时。使用 hist 时,似乎还可以,但我真的不认为这种行为是正确的,所以这一定是我在某个地方的错误。我实际上非常了解我想要做什么,或者至少我希望如此,但不幸的是,Matlab 让我觉得这一切都很难:)

【问题讨论】:

  • 我已经改变了我的问题,实际上你提供的链接对我没有多大帮助。我之前在网上搜索过,也找到了那个帖子,但我仍然卡在那里:/
  • 如果您仔细阅读该线程,它确认您需要使用imhist,而不是hist,因为前者对二维图像(即矩阵)进行操作,而后者仅对向量进行操作。
  • ok..so 当我使用 reshape 将像素矩阵转换为一个行向量时,hist 函数应该可以工作吗?
  • 这可能行得通,但效率低下且毫无意义——为什么不首先使用imhist

标签: matlab image-processing histogram entropy


【解决方案1】:

hist- 计算彩色图像中的直方图(每个像素出现的次数)......

imhist- 在二维图像中计算直方图。

【讨论】:

    【解决方案2】:

    如果您想使用imhist,请使用im2double 而不是doubleimhist 函数要求双精度或单精度数据位于 [0,1] 数据范围内,这就是为什么您会在直方图的最后一个 bin 中看到所有内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-06
      • 2021-11-29
      • 1970-01-01
      • 1970-01-01
      • 2017-05-12
      • 2015-06-02
      • 2013-03-26
      • 1970-01-01
      相关资源
      最近更新 更多