【问题标题】:entropy and histogram熵和直方图
【发布时间】:2015-01-02 05:45:41
【问题描述】:

我尝试从我的工作区读取一个文件,并使用灰度直方图计算每个图像带的一阶熵 这是我的尝试,我可以使用加载功能读取 .mat 文件

clc
I = load('file.mat'); 
E = entropy(I);
hist(E);
figure
plot(E);

更新: 这是代码:

I = load('file.mat'); 
E = zeros(1,size(I,3));

for idx = 1 : size(I,3)
    %// Calculate PDF
    chan = I(:,:,idx);
    h = imhist(chan);

end

现在,我收到此错误:

再次感谢您的帮助

【问题讨论】:

  • I 到底是什么?这是彩色图像吗?从您的代码中不是很清楚。顺便说一句,entropy已经计算了整个图像的熵。它在内部计算强度的直方图 / PDF 并以这种方式计算熵。另外,看看这篇文章以获得洞察力:stackoverflow.com/questions/27726735/… - 然而,这篇文章只是计算图像一部分的熵。只需更改代码,以便它在整个图像上使用它。
  • 完全没问题。在回答您的问题之前,我只是想了解所有事实。我已经为你写了一个答案。祝你好运!
  • 这是说您的Istruct 而不是图像。您可能使用save 来保存您的工作区。请在命令提示符中输入I,按回车键,然后将其输出复制并粘贴到此处。
  • 嗯嗯。那正是我所想。 Istruct。因此,您需要通过以下方式访问实际图像数据:im = I.indians_pines_corrected;。我已经更正了我的帖子。现在检查它 - 它应该工作。顺便说一句,如果您没有向我们提供错误信息,将会有所帮助。 I 不是图像 - 它是 struct
  • 这可能是你的形象。这与我编写的代码无关。不幸的是,我无法帮助你!祝你好运!

标签: matlab image-processing entropy


【解决方案1】:

回想一下熵(香农)定义为:

在这种情况下,b = 2。你需要做的是假设我们有一张灰度图像,我们需要找到图像的概率分布函数,然后使用上面的定义来计算我们的熵。 MATLAB 中的 entropy 命令已经为我们完成了这项工作,但从您的 cmets 来看,您希望从第一原则开始执行此操作。只需按照我上面概述的程序即可。因此,对于灰度图像,我们首先需要通过imhist抓取图像的直方图,然后通过图像中的像素总数对其进行归一化,得到概率分布函数。

因此,如果您的图像被加载到im 并且是灰度的,那么您就是这样计算熵的:

%// Grab image data
im = I.indian_pines_corrected;

%// Calculate PDF
h = imhist(I);
h = h / numel(I);

%// Set any entries in the PDF that are 0 to 1 so log calculation works
h(h == 0) = 1;

%// Calculate entropy
E = -sum(h.*log2(h));

上面的代码通过了我们已经概述的逻辑。但是,请看第三行代码。概率分布函数中的任何条目为 0,log 计算将生成一个无效数字,因此为了使log 函数安全地将其设为 0,我们将 PDF 中的任何值设置为 0 到 1,这样log(1) = 0。本质上,熵计算将忽略这些条目,以便我们可以正确计算值。

因为你有一个color图像,你所要做的就是把每个颜色通道当作一个单独的灰度图像,所以我们可以使用上面的代码循环每个通道。只需将每个颜色通道提取为灰度图像,并计算每个颜色通道的熵。因此,假设I 是彩色图像:

%// Grab image data
im = I.indian_pines_corrected;

E = zeros(1,size(I,3));

for idx = 1 : size(I,3)
    %// Calculate PDF
    chan = I(:,:,idx);
    h = imhist(chan);
    h = h / numel(chan);

    %// Find any entries in the PDF that are 0 to 1 so log calculation works
    h(h == 0) = 1;

    %// Calculate entropy
    E(idx) = -sum(h.*log2(h));
end

E 将是一个数组,其中每个元素都会告诉您每个颜色通道的熵。因此,第一个元素将是第一个通道(红色)的熵,第二个元素将是第二个(绿色),依此类推。

【讨论】:

  • 感谢 rayryeng 的帮助,但现在我遇到了一个新问题,我已经更新了帖子
  • @Lina - 请不要编辑我的帖子。您的更改会破坏我的代码并且它不会起作用。将来,如果您想对帖子提出更改建议,请发表评论并验证您提出的更改是否有效,并且它提供的信息与您提出的修改之前相同。
猜你喜欢
  • 2017-01-24
  • 2017-01-30
  • 2021-02-08
  • 1970-01-01
  • 2013-05-07
  • 2015-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多