本页对应的英文页面已更新,但尚未翻译。 若要查看最新内容,请点击此处访问英文页面。
此示例说明如何使用盲反卷积对图像进行去模糊。当不知道关于失真(模糊和噪声)的信息时,使用盲反卷积算法很有效。该算法同时还原图像和点扩散函数 (PSF)。每次迭代中都使用加速阻尼 Richardson-Lucy 算法。附加的光学系统(例如照相机)特征可以用作输入参数,这有助于提高图像还原的质量。PSF 约束可以通过用户指定的函数传递。
将灰度图像读入工作区。deconvblind
函数可以处理任何维度的数组。
I = imread('cameraman.tif'); figure;imshow(I);title('Original Image'); text(size(I,2),size(I,1)+15, ... 'Image courtesy of Massachusetts Institute of Technology', ... 'FontSize',7,'HorizontalAlignment','right');
模拟模糊的真实图像(例如,因为照相机移动或失焦而模糊)。此示例通过使用高斯滤波器对真实图像进行卷积来模拟模糊效果(使用 imfilter
)。然后,高斯滤波器表示点扩散函数 PSF
。
PSF = fspecial('gaussian',7,10); Blurred = imfilter(I,PSF,'symmetric','conv'); imshow(Blurred) title('Blurred Image')
为了说明了解真实 PSF 大小的重要性,此示例执行三次还原。对于每次还原,PSF 重构都从均匀数组(由 1 组成的数组)开始。
第一次还原(J1
和 P1
)使用大小过小的数组 UNDERPSF
获得 PSF 的初始估计值。在每个维度上,UNDERPSF 数组的大小都比真实 PSF 短 4 个像素。
UNDERPSF = ones(size(PSF)-4);
[J1,P1] = deconvblind(Blurred,UNDERPSF);
imshow(J1)
title('Deblurring with Undersized PSF')
第二次还原(J2
和 P2
)使用由 1 组成的数组 OVERPSF
来获得初始 PSF,该初始 PSF 在每个维度上都比真实 PSF 长 4 个像素。
OVERPSF = padarray(UNDERPSF,[4 4],'replicate','both'); [J2,P2] = deconvblind(Blurred,OVERPSF); imshow(J2) title('Deblurring with Oversized PSF')
第三次还原(J3
和 P3
)使用由 1 组成的数组 INITPSF
获得与真实 PSF 大小完全相同的初始 PSF。
INITPSF = padarray(UNDERPSF,[2 2],'replicate','both'); [J3,P3] = deconvblind(Blurred,INITPSF); imshow(J3) title('Deblurring with INITPSF')
所有三个还原还会生成一个 PSF。下列各图显示对重构的 PSF 的分析如何有助于估计初始 PSF 的正确大小。在真实的 PSF(一个高斯滤波器)中,最大值在中心(白色),在边界处(黑色)减小。
figure; subplot(2,2,1) imshow(PSF,[],'InitialMagnification','fit') title('True PSF') subplot(222) imshow(P1,[],'InitialMagnification','fit') title('Reconstructed Undersized PSF') subplot(2,2,3) imshow(P2,[],'InitialMagnification','fit') title('Reconstructed Oversized PSF') subplot(2,2,4) imshow(P3,[],'InitialMagnification','fit') title('Reconstructed true PSF')
在第一次还原中重构的 PSF P1
显然无法放入限定的大小之内。它在边界上有很强的信号变化。相对于模糊图像 Blurred
,对应的图像 J1
在清晰度上并未显示出任何改进。
在第二个还原中重构的 PSF (P2
) 在边缘处变得非常平滑。这意味着还原可以处理大小较小的 PSF。对应的图像 J2
显示消除了一些模糊,但被振铃效应严破坏。
最后,在第三个还原中重构的 PSF P3
在某种程度上介于 P1
和 P2
之间。数组 P3
非常像真实的 PSF。对应的图像 J3
显示出显著的改进;然而,它仍然被振铃效应破坏。
还原的图像 J3
中的振铃效应发生在图像中强度对比强烈的区域和图像边界上。此示例说明如何通过指定加权函数来减少振铃效应。该算法根据 WEIGHT
数组对每个像素进行加权,同时还原图像和 PSF。在我们的示例中,我们首先使用边缘函数找到“较高锐度”的像素。通过反复试验,我们确定理想的阈值水平是 0.08。
WEIGHT = edge(Blurred,'sobel',.08);
为了扩大区域,我们使用 imdilate
并传入结构元素 se
。
se = strel('disk',2);
WEIGHT = 1-double(imdilate(WEIGHT,se));
靠近边界的像素也被赋值为 0。
WEIGHT([1:3 end-(0:2)],:) = 0;
WEIGHT(:,[1:3 end-(0:2)]) = 0;
figure
imshow(WEIGHT)
title('Weight Array')
调用 deconvblind 还原图像时加上 WEIGHT
数组并增加迭代次数 (30)。几乎所有振铃效应都被消除。
[J,P] = deconvblind(Blurred,INITPSF,30,[],WEIGHT);
imshow(J)
title('Deblurred Image')
此示例说明如何对 PSF 指定附加约束。以下函数 FUN
返回修正 PSF 数组,deconvblind 将该数组用于下一次迭代。
在此示例中,FUN
会修正 PSF,分别在每个维度中裁去 P1
和 P2
个像素,然后用零回填数组以恢复其原始大小。此运算不会更改 PSF 中心的值,但实际上会将 PSF 大小减小 2*P1
和 2*P2
个像素。
P1 = 2; P2 = 2; FUN = @(PSF) padarray(PSF(P1+1:end-P1,P2+1:end-P2),[P1 P2]);
匿名函数 FUN
最后会传入 deconvblind
中。有关向函数 FUN
提供附加参数的信息,请参阅 MATLAB Mathematics 文档中的 Parameterizing Functions 一节。
在此示例中,初始 PSF OVERPSF
的大小比真实 PSF 大 4 个像素。在 FUN
中将 P1 = 2 和 P2 = 2 设置为参数,实际上使 OVERPSF
中有效空间的大小与真实 PSF 相同。因此,结果(JF
和 PF
)与步骤 4 中的结果 J
和 P
类似,该步骤中执行卷积时使用了合适大小的 PSF,但没用调用 FUN
。
[JF,PF] = deconvblind(Blurred,OVERPSF,30,[],WEIGHT,FUN);
imshow(JF)
title('Deblurred Image')
如果我们使用了过大的初始 PSF OVERPSF
而没有使用约束函数 FUN
,得到的图像将类似于在步骤 3 中获得的不尽如人意的结果 J2
。
请注意,在 FUN
之前的任何未指定参数都可以直接省略,例如此示例中的 DAMPAR
和 READOUT
,不需要补上占位符 ([])。