1. 程式人生 > 實用技巧 >MATLAB 影象區域性熵

MATLAB 影象區域性熵

今天在看區域性熵方面的內容,看論文中介紹的內容感覺區域性熵挺容易了,於是就有了實現的想法,結果效果非常糟糕。

得到的幾乎是一張空白的圖片,就像下面一樣:

究其原因是各種論文上都寫了這樣一個公式:

這裡f(i,j)就是在m*n這個區域性的畫素,這個沒問題,不過這裡的p是什麼東西,按這裡的定義p是當前畫素灰度佔區域性總灰度的概率,而p原本應該是區域性直方圖,也就是當前畫素灰度個數佔區域性畫素總個數的概率,所以這裡的意義我也不明白了,結果按公式計算就得到了上圖,和各種論文中的圖都不一樣。

而真正的公式應該是這樣:

熵的公式本來不就是這樣麼,這裡的p是歸一化後的區域性直方圖。

這樣執行的結果就正確了,和matlab系統提供的entropyfilt函式結果是一樣的。

自己函式處理的

系統函式處理的

matlab程式碼如下:

 1 clear all;
 2 close all;
 3 clc;
 4 
 5 img=imread('lena.jpg');
 6 [m n]=size(img);
 7 w=3;    %模板半徑
 8 imgn=zeros(m,n);
 9 for i=1+w:m-w
10     for j=1+w:n-w
11         
12         Hist=zeros(1,256);
13         for p=i-w:i+w
14             for q=j-w:j+w
15                 Hist(img(p,q)+1
)=Hist(img(p,q)+1)+1; %統計區域性直方圖 16 end 17 end 18 Hist=Hist/sum(Hist); 19 for k=1:256 20 if Hist(k)~=0 21 imgn(i,j)=imgn(i,j)+Hist(k)*log(1/Hist(k)); %區域性熵 22 end 23 end 24 %{ 25 p=sum(sum(img(i-w:i+2
,j-w:j+w))); %這裡是按第一個公式寫的 26 s=img(i-w:i+w,j-w:j+w)/p; 27 imgn(i,j)=-sum(sum(s.*log(s))); 28 %} 29 end 30 end 31 imshow(imgn,[]) 32 33 imgn=entropyfilt(img); %系統的區域性熵函式 34 figure; 35 imshow(imgn,[])