最大熵阈值分割法

最大熵阈值分割法1 什么是熵 熵是用来衡量一个分布的均匀程度 熵越大 说明分布越均匀 在信息论中 信息熵可以说明消息的混沌程度 熵越大说明消息越不明了 难以从消息中得到有效信息 举一个超级简单的例子 假设一辆车开到了一个 T 字型的路口 限定它必须要么左转 要么右转 设左转的概率是 P1 右转的概率是 P2 除此之外没有任何信息了 问如何估计 P1 和 P2 你现在有的信息仅仅是 P1 P2 1 而已 按最大熵的思想 既

(1)什么是熵?

熵是用来衡量一个分布的均匀程度,熵越大,说明分布越均匀

在信息论中,信息熵可以说明消息的混沌程度,熵越大说明消息越不明了,难以从消息中得到有效信息。举一个超级简单的例子,假设一辆车开到了一个T字型的路口,限定它必须要么左转,要么右转,设左转的概率是P1,右转的概率是P2,除此之外没有任何信息了,问如何估计P1和P2?你现在有的信息仅仅是P1+P2=1而已,按最大熵的思想,既然你没有其他任何信息来说明向左转的可能性比向右转的可能性大(或小),那就应该把它们两一视同仁,同等对待,不能偏袒其一,于是应该 P1=P2=1/2,这就是最大熵的思想。仔细想想还是挺有道理的,假设你觉得这样不是最合适的解,你给出了另一个解P1=3/4,P2=1/4那就要问了,凭什么往左转的概率比往右转的大呢?已经没有任何信息再支持你的判断了呀。因此,只能把它们两同等对待了。事实上,P1=P2=1/2这个分布的熵比这个P1=3/4,P2=1/4分布的熵要大,因为前者比后者均匀,越均匀熵越大,就越是同等对待(均匀的意思就是大家都一样)。

(2)熵的定义

                                                                           最大熵阈值分割法

这里log的底数取多少并没有规定

(3)最大熵阈值分割原理

利用图像熵为准则进行图像分割是由Kapuret提出来,是现在仍然使用较广的一种图像熵分割方法。原论文《A New Method forGray-Level Picture ThresholdingUsing the Entropy of the Histogram》,在百度学术上可以免费下载。

给定一个特定的阈值 q(0<=q

                                          最大熵阈值分割法

                                                        最大熵阈值分割法

P0(q),P1(q)分别表示的是q阈值分割的背景和前景像素的累计概率,两者之和为1。背景和前景对应的熵表示如下:

                                                           最大熵阈值分割法

在该阈值下,图像总熵为:

                                                              最大熵阈值分割法

计算所有分割阈值下的图像总熵,找到最大的熵,将最大熵对应的分割阈值作为最终的阈值,图像中灰度大于此阈值的像素作为前景,否则作为背景。

分割阈值的选取是困难的,我们在算法中选取了256个分割阈值,也就是256级灰度,从第1级灰度一直计算到第256级灰度,因此有256个图像总熵,找到最大的总熵及其位置,例如是第50个,那么最终的分割阈值就是灰度=50。

MATLAB代码如下:

clear Imag = imread('rice.png'); [X, Y] = size(Imag); figure (); imhist(Imag); % 计算图像直方图 hist = imhist(Imag); p = hist/(X*Y); % 各灰度概率 sumP = cumsum(p); sumQ = 1-sumP; %将256个灰度作为256个分割阈值,分别计算各阈值下的概率密度函数 c0 = zeros(256,256); c1 = zeros(256,256); for i = 1:256 for j = 1:i if sumP(i) > 0 c0(i,j) = p(j)/sumP(i); %计算各个阈值下的前景概率密度函数 else c0(i,j) = 0; end for k = i+1:256 if sumQ(i) > 0; c1(i,k) = p(k)/sumQ(i); %计算各个阈值下的背景概率密度函数 else c1(i,k) = 0; end end end end %计算各个阈值下的前景和背景像素的累计熵 H0 = zeros(256,256); H1 = zeros(256,256); for i = 1:256 for j = 1:i if c0(i,j) ~=0 H0(i,j) = - c0(i,j).*log10(c0(i,j)); %计算各个阈值下的前景熵 end for k = i+1:256 if c1(i,k) ~=0 H1(i,k) = -c1(i,k).*log10(c1(i,k)); %计算各个阈值下的背景熵 end end end end HH0 = sum(H0,2); HH1 = sum(H1,2); H = HH0 + HH1; [value, Threshold] = max(H); BW = im2bw(Imag, Threshold/255); figure (); imshow(BW); xlabel(['最大熵', num2str(Threshold)]); 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/177452.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午7:29
下一篇 2026年3月26日 下午7:29


相关推荐

  • sendfile相关「建议收藏」

    sendfile相关「建议收藏」考虑将一个本地文件通过socket发送出去的问题。我们通常的做法是:打开文件fd和一个socket,然后循环地从文件fd中read数据,并将读取的数据send到socket中。这样,每次读写我们都需要两次系统调用,并且数据会被从内核拷贝到用户空间(read),再从用户空间拷贝到内核(send)。而sendfile就将整个发送过程封装在一个系统调用中,避免了多次系统调用,避免了数据在内核空间

    2022年5月8日
    38
  • IIS服务启动发生意外错误0x8ffe2740的解决方法

    IIS服务启动发生意外错误0x8ffe2740的解决方法如果系统中存在端口冲突就有可能发生本情况.IIS默认使用80端口进行HTTP通信.如果除IIS外的应用程序正在运行并且正在相同的IP地址上使用80端口,在您试图使用IIS管理器启动网站时您也可能收

    2022年7月3日
    34
  • SQL中的聚合函数使用总结

    SQL中的聚合函数使用总结一般在书写sql的是时候很多时候会误将聚合函数放到where后面作为条件查询,事实证明这样是无法执行的,执行会报【此处不允许使用聚合函数】异常。为什么会报异常呢?其原因很简单:having放在groupby的后面 groupby后面只能放非聚合函数的列 where子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使…

    2022年6月21日
    35
  • 解决win10状态栏的搜索框无法搜索本地应用或无反应

    解决win10状态栏的搜索框无法搜索本地应用或无反应今天突然出现的问题,在状态栏左下角的搜索框搜索OneNote没有任何反应,对,就是这个地方。最后在另一篇博客上找到了答案,那篇博客也是在知乎找到的答案,虽然是用被人的方法解决了问题,但我还是打算记下来;1、首先,打开管理员命令窗口,win+x,可以看到弹出一个窗口,打开windowsPowershell(管理员)如图2,输入下面这行英文startpowershell然…

    2022年6月4日
    46
  • Lync 2010 服务器的部署之目录篇

    Lync 2010 服务器的部署之目录篇

    2021年8月19日
    65
  • Stata:合成控制法程序分享

    Stata:合成控制法程序分享原文链接:https://www.lianxh.cn/news/bf1839debd082.htmlYiqingXu-R程序-一般化合成控制法 一个完整的合成控制法Stata范例-包含数据、假设检验和图形展示等||-PDF- Atooltorunapoolofsyntheticcontrols,conductinference,andproducevisualizations. 原文链接:https://www.lianxh.cn/news/b..

    2022年6月11日
    31

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号