今天在看局部熵方面的內容,看論文中介紹的內容感覺局部熵挺容易了,於是就有了實現的想法,結果效果非常糟糕。
得到的幾乎是一張空白的圖片,就像下面一樣:
究其原因是各種論文上都寫了這樣一個公式:
這里f(i,j)就是在m*n這個局部的像素,這個沒問題,不過這里的p是什么東西,按這里的定義p是當前像素灰度占局部總灰度的概率,而p原本應該是局部直方圖,也就是當前像素灰度個數占局部像素總個數的概率,所以這里的意義我也不明白了,結果按公式計算就得到了上圖,和各種論文中的圖都不一樣。
而真正的公式應該是這樣:
熵的公式本來不就是這樣么,這里的p是歸一化后的局部直方圖。
這樣運行的結果就正確了,和matlab系統提供的entropyfilt函數結果是一樣的。
自己函數處理的
系統函數處理的
matlab代碼如下:
clear all; close all; clc; img=imread('lena.jpg'); [m n]=size(img); w=3; %模板半徑 imgn=zeros(m,n); for i=1+w:m-w for j=1+w:n-w Hist=zeros(1,256); for p=i-w:i+w for q=j-w:j+w Hist(img(p,q)+1)=Hist(img(p,q)+1)+1; %統計局部直方圖 end end Hist=Hist/sum(Hist); for k=1:256 if Hist(k)~=0 imgn(i,j)=imgn(i,j)+Hist(k)*log(1/Hist(k)); %局部熵 end end %{ p=sum(sum(img(i-w:i+2,j-w:j+w))); %這里是按第一個公式寫的 s=img(i-w:i+w,j-w:j+w)/p; imgn(i,j)=-sum(sum(s.*log(s))); %} end end imshow(imgn,[]) imgn=entropyfilt(img); %系統的局部熵函數 figure; imshow(imgn,[])