盲去卷积 图像复原 matlab源码解释
下面是一个人写的盲去卷积算法实现图像去模糊,其中有些代码不是很能理解,求解释!尤其每次都做这个循环:
for i=1:x_size %进行乘(-1)^(i+j)处理
for j=1:y_size
flag=(-1)^(i+j);
tmp1(i,j)=tmp1(i,j)*flag;
end
end
到底是干嘛?最好能对整段代码加些注释再贴到回复里面。谢谢!
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%程序内容:盲迭代反卷积方法恢复图象
%%编程时间:2007年12月16日
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear all;
gray_S=imread('cameraman.jpg'); %读入图像
figure;imshow(gray_S);title('original image') %显示原始图
[x_size,y_size]=size(gray_S);
%求取PSF尺寸大小(圆形)
p_size=5; %定义psf尺寸大小
p_support=zeros(x_size,y_size); %psf掩模
p_support(1:p_size,1:p_size)=1;
beta=0.9; %参数设置
g=im2double(gray_S); %转换为double型
tmp1=g;
flag=1;
for i=1:x_size %进行乘(-1)^(i+j)处理
for j=1:y_size
flag=(-1)^(i+j);
tmp1(i,j)=tmp1(i,j)*flag;
end
end
G=fft2(tmp1);
F0=fft2(tmp1);
F1=zeros(x_size,y_size);
%-----------------------------循环迭代
for k=1:40 %确定迭代次数
H=G./F0; %确定H,并且把小于0的部分置为0
h=ifft2(H);
tmp1=h;
for i=1:x_size
for j=1:y_size
flag=(-1)^(i+j);
tmp1(i,j)=tmp1(i,j)*flag;
end
end
tmp2=real(tmp1); %取实部
tmp3=find(tmp2<0);
tmp2(tmp3(:))=0; %将小于0的部分置0
h=tmp2.*p_support; %使用掩模,只留下中间圆的PSF部分
tmp1=h;
for i=1:x_size %进行乘(-1)^(i+j)处理
for j=1:y_size
flag=(-1)^(i+j);
tmp1(i,j)=tmp1(i,j)*flag;
end
end
H=fft2(tmp1);
%加上傅立叶条件限制
a1=find(abs(H(:))>=abs(G(:)));
a2=find(abs(H(:))<abs(G(:)));
F1(a1(:))=(1-beta)*F0(a1(:))+beta*(G(a1(:))./H(a1(:)));
F1(a2(:))=((1-beta)*F0(a2(:)).^(-1)+beta*H(a2(:))./G(a2(:))).^(-1);
f1=ifft2(F1); %把图像空域小于0的部分置0
tmp1=f1;
for i=1:x_size %进行乘(-1)^(i+j)处理
for j=1:y_size
flag=(-1)^(i+j);
tmp1(i,j)=tmp1(i,j)*flag;
end
end
tmp2=real(tmp1);
tmp3=find(tmp2<0);
tmp2(tmp3(:))=0;
f1=tmp2;
tmp1=f1;
for i=1:x_size %进行乘(-1)^(i+j)处理
for j=1:y_size
flag=(-1)^(i+j);
tmp1(i,j)=tmp1(i,j)*flag;
end
end
F0=fft2(tmp1);
end
figure;imshow(uint8(real(f1)*255/max(f1(:))));title('result image') %显示结果图
imwrite(uint8(real(f1)*255/max(f1(:))),'best.bmp');
%mesh(h(1:p_size,1:p_size))