matlab練習程序(圖像局部熵)


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

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

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

這里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,[])

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM