熵和直方图

时间:2015-01-02 05:45:42

标签: matlab image-processing entropy

我尝试从工作区读取文件,并使用灰度级直方图计算每个图像带的一个顺序的熵 这是我的尝试,我可以使用加载函数

读取.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

现在,我收到此错误: enter image description here

再次感谢您的帮助

1 个答案:

答案 0 :(得分:3)

回顾定义,熵(Shannon)定义为:

在这种情况下,b = 2。你需要做的是假设我们有一个灰度图像,我们需要找到图像的概率分布函数,然后使用上面的定义来计算我们的熵。 MATLAB中的entropy命令已经为我们做了这个,但是从你的评论中,你想从最初的原则做到这一点。只需按照我上面概述的程序。因此,对于灰度图像,我们首先需要通过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。基本上,熵计算将忽略这些条目,以便我们可以正确计算该值。

因为您有一个颜色图像,所以您需要做的就是将每个颜色通道视为单独的灰度图像,因此我们可以使用上面的代码并循环遍历每个通道。只需将每个颜色通道提取为灰度图像,然后计算每个颜色通道的熵。因此,假设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将是一个数组,其中每个元素都会告诉您每个颜色通道的熵。因此,第一个元素是第一个通道的熵(红色),第二个元素是第二个(绿色),依此类推。