最大熵图像复原方法原理(附完整代码)
对图像复原问题加以最大熵约束的归整化恢复方法称为图像的最大熵恢复,它是一种非线性的方法,在图像恢复领域中有着重要的影响。最大熵方法要求恢复的图像在满足成像公式的前提下熵最大。也即在图像恢复问题的所有可行解中,选择熵最大的那一个作为最终的解。
原理
假设原始图像为xxx降质图像为yyy,成像系统的点扩展函数(PSF)为hhh,则降质过程可表示为:
y=h×x+ny=h\times x+n y=h×x+n
其中nnn为系统的加性噪声。再记图像的熵S(x)S(x)S(x),那么最大熵图像恢复问题的一般描述如下公式所示:
maxS(x)st.y=h×x+nmax\ S(x)\\ st. \ y=h \times x +n max S(x)st. y=h×x+n
设整个观测图像yyy有个MMM像元,目标图像xxx有个NNN像元,且:
∑i=1Nxi=1∑i=1Nxihk,i=yk,1≤k≤M\sum_{i=1}^{N}x_{i}=1 \\ \sum_{i=1}^{N}x_{i}h_{k,i}=y_{k}, \ 1 \leq k \leq M i=1∑Nxi=1i=1∑Nxihk,i=yk, 1≤k≤M
这里不将噪声考虑在内。最大熵方法要求在满足上述两个公式两项约束的前提下使得图像的熵最大。运用Lagrange乘子法可以解得:
xi=exp(−λ0−∑k=1Mλkhk,j)=exp(−∑k=1M)λkhk,lZ(λ1,λ2,⋅⋅⋅λM)x_{i}=exp(-\lambda_{0}-\sum_{k=1}^{M}\lambda_{k}h_{k,j}) \\ =\frac{exp(-\sum_{k=1}^{M}) \lambda_{k}h_{k,l}}{Z(\lambda_{1},\lambda_{2},···\lambda_{M})} xi=exp(−λ0−k=1∑Mλkhk,j)=Z(λ1,λ2,⋅⋅⋅λM)exp(−∑k=1M)λkhk,l
其中λ0=lnZ(λ1,λ2,⋅⋅⋅λM)\lambda_{0}=lnZ(\lambda_{1},\lambda_{2},···\lambda_{M})λ0=lnZ(λ1,λ2,⋅⋅⋅λM),λ1,λ2⋅⋅⋅λM\lambda_{1},\lambda_{2}···\lambda_{M}λ1,λ2⋅⋅⋅λM,为Lagrange乘子。
Z=exp(λ0)=∑i=1Nexp(−∑k=1Mλkhk,i)Z=exp(\lambda_{0})=\sum_{i=1}^{N}exp(-\sum_{k=1}^{M}\lambda_{k}h_{k,i}) Z=exp(λ0)=i=1∑Nexp(−k=1∑Mλkhk,i)
上面刚说的这个公式为配分函数,结合上述可以得到:
−∂lnZ∂λk+yk=0k=1,2⋯M-\frac{\partial \ln Z}{\partial \lambda_{k}}+y_{k}=0 \quad k=1,2 \cdots M −∂λk∂lnZ+yk=0k=1,2⋯M
或:
∑i=1N(hk,i−yk)exp(−∑s=1Mλshs,i)=0k=1,2⋯M\sum_{i=1}^{N}\left(h_{k, i}-y_{k}\right) \exp \left(-\sum_{s=1}^{M} \lambda_{s} h_{s, i}\right)=0 \quad k=1,2 \cdots M i=1∑N(hk,i−yk)exp(−s=1∑Mλshs,i)=0k=1,2⋯M
将求得的xix_{i}xi回代到约束方程中得到M+1M+1M+1个关于Lagrange乘子λk\lambda_{k}λk的方程。为避免这个非线性方程组的直接求解。引入势函数:
F=λ0+∑k=1MλkykF=\lambda_{0}+\sum_{k=1}^{M} \lambda_{k} y_{k} F=λ0+k=1∑Mλkyk
对FFF求关于λk\lambda_{k}λk的偏导数并令之为零即可,得到:
Gk=∂F∂λk=−∑i=1Nxihk,i+yk=0G_{k}=\frac{\partial F}{\partial \lambda_{k}}=-\sum_{i=1}^{N} x_{i} h_{k, i}+y_{k}=0 Gk=∂λk∂F=−i=1∑Nxihk,i+yk=0
采用逐次逼近的方法,用下面的迭代公式求解:
λk(new)=λold−Gk,k=1,2,⋅⋅⋅M\lambda_{k}(new)=\lambda_{old}-G_{k}, \ k=1,2,···M λk(new)=λold−Gk, k=1,2,⋅⋅⋅M
初始迭代从均匀的λk\lambda_{k}λk开始(此时熵最大),求得xix_{i}xi,而后利用式Gk=∂F∂λk=−∑i=1Nxihk,i+yk=0G_{k}=\frac{\partial F}{\partial \lambda_{k}}=-\sum_{i=1}^{N} x_{i} h_{k, i}+y_{k}=0Gk=∂λk∂F=−∑i=1Nxihk,i+yk=0求新的λk\lambda_{k}λk,然后再按公式(2-11)求新的,依次迭代下去,直至趋于收敛。采用公式λk(new)=λold−Gk,k=1,2,⋅⋅⋅M\lambda_{k}(new)=\lambda_{old}-G_{k}, \ k=1,2,···Mλk(new)=λold−Gk, k=1,2,⋅⋅⋅M可以使得迭代加速收敛:
λk(new)=λk(old)−ln[ykyk−Gk]k=1,2⋯M\lambda_{k}(n e w)=\lambda_{k}(o l d)-\ln \left[\frac{y_{k}}{y_{k}-G_{k}}\right] \quad k=1,2 \cdots M λk(new)=λk(old)−ln[yk−Gkyk]k=1,2⋯M
代码
为了验证算法的有效性,本文先用Circuit_original.tif自己构造一个简单的运动模糊图像,对其进行最大熵复原。MatLab代码如下:
clear; clear all;
im=imread('Circuit_original.tif');%读入原始图像
%figure,imshow(im);title('original');%显示原始图像
LEN=5; THETA=10;
PSF=fspecial('motion',LEN,THETA); %点扩展函数,假设的真实的PSF
blurred_image=imfilter(im,PSF,'circular','conv'); %卷积生成模糊图像,h1为对应的点扩展函数,对任意类型数组或多维图像进行滤波。
blurred_image=im2double(blurred_image);
mask=ones(size(blurred_image));%掩模图像支持
n=200; %迭代次数
lambda=zeros(size(blurred_image));%lambda参数初始化为0,此时熵最大,但不满足约束方程
blurred_image=blurred_image+mean2(blurred_image)/1000;%保证大于0
totd=sum(sum(blurred_image));
for i=1:n deblurred=exp(conv2(lambda,PSF,'same'));%卷积和指数运算 deblurred=deblurred/sum(sum(deblurred));%归一化 reblurred=conv2(deblurred,PSF,'same');%重模糊化图像 scale=sum(sum(reblurred.*mask))/totd;%动态归一化因子 %修正lambda的值 if i<100 lambda=lambda+(blurred_image*scale-reblurred).*mask;%前面50次迭代选择(g-h*reblured)作为修正项 else reblurred=0.00001*(reblurred==0)+reblurred; lambda=lambda+log(blurred_image*scale./reblurred).*mask;%后面选择ln(g)-ln(h*reblured)作为修正项 end
end
deblurred_image=deblurred/scale-mean2(blurred_image)/1000;%减去前面的增量
subplot(1,2,1);imshow(blurred_image,[]);title('motion blurred image'); %显示运动模糊化图像
subplot(1,2,2);imshow(deblurred_image,[]);title('max extropy deblurred image');%显示去模糊化后的恢复图像
实验结果
从上图可以看出,运动模糊后的图像,经过最大熵算法处理之后,效果改进明显。验证了代码的有效性。
完整实验代码,公众号后台回复:数字图像作业一。
我的微信公众号名称:深度学习与先进智能决策
微信公众号ID:MultiAgent1024
公众号介绍:主要研究分享深度学习、机器博弈、强化学习等相关内容!期待您的关注,欢迎一起学习交流进步!
最大熵图像复原方法原理(附完整代码)相关推荐
- 数学分析模型(一):数据的无量纲处理方法及示例(附完整代码)
数据的无量纲处理方法及示例(附完整代码) (1)极值化方法 (2)标准化方法 (3)均值化方法 示例 要求 建模步骤 程序 结果 备注 在对实际问题建模过程中,特别是在建立指标评价体系时,常常会面临不 ...
- Chart.js清空canvas画布 clearRect()等canvas方法擦除失败(附完整代码)
Chart.js清空canvas画布 clearRect等canvas方法擦除失败 一.直接移除DOM对象方式 原因 方法 二.完整代码 html javascript chart.js画图方法 三. ...
- Three.js实例详解___旋转的精灵女孩(附完整代码和资源)(一)
Three.js实例详解___旋转的精灵女孩(附完整代码和资源)(一) 本文目录: 一.[旋转的精灵女孩]案例运行效果 二.Three.js简介 三.Three.js代码正常运行显示条件 (1)不载入 ...
- Python数据可视化:2018年北上广深空气质量分析(附完整代码)
♚ 法纳斯特,Python爱好者,喜欢爬虫,数据分析以及可视化. 就在这周偶然看到一个学弟吐槽天津的空气,不禁想起那段厚德载雾,自强不吸的日子. 无图无真相,下图为证. 左边的图是去年2月份的时候,这 ...
- python代码手机壁纸_Python制作微信好友背景墙教程(附完整代码)
引言 前段时间,微信朋友圈开始出现了一种晒照片新形式,微信好友墙,即在一张大图片中展示出自己的所有微信好友的头像. 效果如下图,出于隐私考虑,这里作了模糊处理. 是不是很炫,而且这还是独一无二的,毕竟 ...
- 怎么在html中加入特效文字,如何使用HTML5+css3实现粒子效果文字动画特效(附完整代码)...
我们在浏览web网页的时候会发现现在的网页做的越来越美观,很多动画特效做的越来越炫酷,这离不开HTML5和css3的深入开发.今天我们要来分享一款基于HTML5和css3的文字特效--粒子效果文字动画 ...
- 五子棋java百度文库_JAVA课程设计 五子棋(内附完整代码).doc
JAVA课程设计 五子棋(内附完整代码) JAVA课程设计 设计题目:五子棋游戏 简要的介绍五子棋 五子棋的起源 五子棋,又被称为"连五子.五子连.串珠.五目.五目碰.五格.五石.五法.五联 ...
- 想要快速爬取整站图片?速进(附完整代码)
大家好,我是不温卜火,是一名计算机学院大数据专业大三的学生,昵称来源于成语-不温不火,本意是希望自己性情温和.作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己 ...
- openfoam计算旋转体滑移网格方法和MRF方法(附案例代码)
1 旋转体数值模拟 openfoam中处理旋转体的方法主要包括两种方法:滑移网格法和多重参考系方法,在滑移网格方法中主要采用的为任意网格界面法(AMI),多重参考系方法则是通过设定多重参考系区域,该区 ...
- 用Python代码画一个足球(附完整代码)
用Python代码画一个足球(附完整代码) C站举办了世界杯征文活动,本文用Python代码画一个足球. 实现方法介绍 本文的绘图工具使用Python的标准库turtle库,无需安装,导入即可使用. ...
最新文章
- 第2章 熟悉Eclipse开发工具---- System.out.println(sum=+(a+b));
- Ubuntu Linux root password - default password
- 【数字信号处理】傅里叶变换性质 ( 序列傅里叶变换共轭对称性质示例 )
- Kotlin中的接口回调
- 学习WPF——使用Font-Awesome图标字体
- django 获取环境变量_python – django settings.py os.environ.get(“X”)没有获取正确的值...
- Spring Data Jpa 不打印sql参数
- MySQL性能优化一
- [c++]在C++中定义常量的两种方法的比较
- 机器学习——k邻近算法(kNN)
- 中国股市的发展进程,审核制到注册制利国利民
- Python 中模拟键盘输入
- macbook更新windows11
- echarts 省市区联动地图
- 李彦宏:我不是传奇(网络转载)
- Python学习-Scipy库稀疏矩阵的建立(面向列的稀疏矩阵、基于坐标格式的稀疏矩阵)
- 为什么聪明人未能拯救世界?|《流浪地球》冷思考...
- openwrt下有线网设置详细过程
- 去中心化数字身份DID简介——二、一个完整的DID使用流程
- 和Surface pro电源适配器说拜拜——Surface PD快充电源线方案讲述
热门文章
- 一种将排序值换算为得分值的方法
- HCIE-Security Day39:理论学习:隐私保护
- HCIE-Security Day6:5个实验深入浅出理解源NAT
- Linux磁盘管理实战
- Linux文件系统下的分区和挂载
- zabbix安装以及监控(一)
- eclipse(Kepler Service Release 2)问题记录
- python+django(解决对象编码显示Test Object问题)
- 《编写可维护的JavaScript》——2.2 多行注释
- Uploading File using Ajax and receiving binary data in Asp.net (C#)[转]