熵和直方图
entropy and histogram
我尝试从我的工作区读取一个文件,并使用灰度直方图计算每个图像波段的一阶熵
这是我的尝试,我可以使用加载函数读取 .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
现在,我得到这个错误:
再次感谢您的帮助
回想一下熵(香农)定义为:
在这种情况下,b = 2
。你需要做的是假设我们有一个灰度图像,我们需要找到图像的概率分布函数,然后使用上面的定义来计算我们的熵。 entropy
command in MATLAB already does this for us, but from your comments, you want to do this from first principles. Just follow the procedure I outlined above. As such, for a grayscale image, we first need to grab the histogram of the image through 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
。本质上,熵计算将忽略这些条目,以便我们可以正确计算值。
因为你有一张 colour 图像,你所要做的就是将每个颜色通道视为一个单独的灰度图像,所以我们可以只使用上面的代码并循环每个渠道。只需将每个颜色通道提取为灰度图像,并计算每个颜色通道的熵。因此,假设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
将是一个数组,其中每个元素都会告诉您每个颜色通道的熵。因此,第一个元素将是第一个通道(红色)的熵,第二个元素将是第二个(绿色),依此类推。
我尝试从我的工作区读取一个文件,并使用灰度直方图计算每个图像波段的一阶熵 这是我的尝试,我可以使用加载函数读取 .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
现在,我得到这个错误:
再次感谢您的帮助
回想一下熵(香农)定义为:
在这种情况下,b = 2
。你需要做的是假设我们有一个灰度图像,我们需要找到图像的概率分布函数,然后使用上面的定义来计算我们的熵。 entropy
command in MATLAB already does this for us, but from your comments, you want to do this from first principles. Just follow the procedure I outlined above. As such, for a grayscale image, we first need to grab the histogram of the image through 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
。本质上,熵计算将忽略这些条目,以便我们可以正确计算值。
因为你有一张 colour 图像,你所要做的就是将每个颜色通道视为一个单独的灰度图像,所以我们可以只使用上面的代码并循环每个渠道。只需将每个颜色通道提取为灰度图像,并计算每个颜色通道的熵。因此,假设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
将是一个数组,其中每个元素都会告诉您每个颜色通道的熵。因此,第一个元素将是第一个通道(红色)的熵,第二个元素将是第二个(绿色),依此类推。