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,[])
复制代码

 

posted @   Dsp Tian  阅读(15471)  评论(4编辑  收藏  举报
编辑推荐:
· .NET Core 对象分配(Alloc)底层原理浅谈
· 聊一聊 C#异步 任务延续的三种底层玩法
· 敏捷开发:如何高效开每日站会
· 为什么 .NET8线程池 容易引发线程饥饿
· golang自带的死锁检测并非银弹
阅读排行:
· 一个适用于 .NET 的开源整洁架构项目模板
· API 风格选对了,文档写好了,项目就成功了一半!
· 【开源】C#上位机必备高效数据转换助手
· .NET 9.0 使用 Vulkan API 编写跨平台图形应用
· .NET 依赖注入中的 Captive Dependency
历史上的今天:
2012-04-11 matlab练习程序(透视变换)
点击右上角即可分享
微信分享提示