【发布时间】:2012-10-01 15:38:16
【问题描述】:
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 让我觉得这一切都很难:)
【问题讨论】:
-
我已经改变了我的问题,实际上你提供的链接对我没有多大帮助。我之前在网上搜索过,也找到了那个帖子,但我仍然卡在那里:/
-
如果您仔细阅读该线程,它确认您需要使用
imhist,而不是hist,因为前者对二维图像(即矩阵)进行操作,而后者仅对向量进行操作。 -
ok..so 当我使用 reshape 将像素矩阵转换为一个行向量时,hist 函数应该可以工作吗?
-
这可能行得通,但效率低下且毫无意义——为什么不首先使用
imhist?
标签: matlab image-processing histogram entropy