Matlab中hist
和imhist
函数有什么区别?我有一个从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对我来说有点困难:)
答案 0 :(得分:2)
hist-计算彩色图像中的直方图(计算每个像素的出现次数).........
imhist-计算二维图像中的直方图。
答案 1 :(得分:1)
如果您想使用im2double
,请使用double
代替imhist
。 imhist
函数需要双精度或单精度数据在[0,1]数据范围内,这就是为什么你会看到直方图的最后一个bin中的所有内容。