www.gusucode.com > 最大熵直接迭代法,维纳滤波和盲恢复对水平方向匀速直线运动造成的模糊图像的恢复研究 > max_extropy_main/max_entropy.m

    function deblurred_image=max_entropy(blurred_image,PSF,n,mask);%最大熵直接迭代算法程序
%blurred_image 模糊化图像,即算法中的Yk;
%PSF 点扩展函数;
%deblurred_image 去模糊化后的恢复图像,即算法中的Xi;
%mask 对残损图像进行掩模操作的矩阵;
%n 迭代次数
if nargin==3
    mask=ones(size(blurred_image));
end
if nargin==2
    n=100;%迭代次数有些讲究
    mask=ones(size(blurred_image));%掩模图像支持
end
if nargin<2
    error('too little input arguments');
end
classin=class(blurred_image);
classChanged=0;
if ~isa(blurred_image,'double') 
    blurred_image=im2double(blurred_image);%完成图像数据类型转换
    classChanged=1;
end
lambda=zeros(size(blurred_image));%lambda参数初始化为0,此时熵最大,但不满足约束方程
blurred_image=blurred_image+mean2(blurred_image)*ones(size(blurred_image))/1000;%对于有些点可能为0,在后面的递推式中会出现log0,故必须保证大于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');%Rk,重模糊化图像
    scale=sum(sum(reblurred.*mask))/totd;%动态归一化因子
    err=abs(blurred_image.*scale-reblurred.*mask);%误差
    entropy=-sum(sum(deblurred.*log(deblurred)));%图像熵
    if i<50
        lambda=lambda+(blurred_image*scale-reblurred).*mask;%前面50次迭代选择Gk作为修正项
    else
        reblurred=0.00001*(reblurred==0)+reblurred;
        lambda=lambda+log(blurred_image*scale./reblurred).*mask;%后面选择lnYk-lnRk作为修正项
    end
end
deblurred_image=deblurred/scale-mean2(blurred_image)/1000;%减去前面的增量
figure,imshow(deblurred_image);title('max extropy deblurred image');%显示去模糊化后的恢复图像