回想一下,熵(香)定义为:
在这种情况下,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
函数安全地将其设置为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
将是一个阵列,其中每个元件会告诉你为每个颜色通道的熵。因此,第一个元素将是第一个通道的熵(红色),第二个元素将是第二个(绿色),依此类推。
'I'究竟是什么?这是一个彩色图像吗?从代码中不太清楚。顺便说一句,'熵'**已经**计算整个图像的熵。它内部计算强度的直方图/ PDF并计算熵。另外,看看这篇文章的见解:http://stackoverflow.com/questions/27726735/how-to-calculate-the-shannon-entropy-of-a-part-of-image-data/27726789#27726789 - 但是,这篇文章只是计算一部分图像的熵。只需更改代码,以便在整个图像上使用它。 – rayryeng
我是。mat文件,我应该使用直方图来计算熵 – Lina
我不知道如何从mat文件中提取信息计算熵,而不是在直方图中显示结果 – Lina