回想一下,熵(香)定義爲:
在這種情況下,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