MATLAB 影象區域性熵
阿新 • • 發佈:2020-09-10
今天在看區域性熵方面的內容,看論文中介紹的內容感覺區域性熵挺容易了,於是就有了實現的想法,結果效果非常糟糕。
得到的幾乎是一張空白的圖片,就像下面一樣:
究其原因是各種論文上都寫了這樣一個公式:
這裡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,[])