www.pudn.com > max_extropy_main.rar > 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');%显示去模糊化后的恢复图像