此示例说明如何使用盲反频域模糊图像。 当不知道有关失真(模糊和噪声)的信息时,使用盲逆频域算法可能是有效的。 该算法可以同时恢复图像和点扩散函数(PSF)。 每次迭代都使用加速的 Decay-Lucy 算法。 其他光学系统(如单反)的特性可以作为输入参数,帮助提高图像复原的质量。 PSF 约束可以通过用户指定的函数传入。
第一步:读图
将灰度图像读入工作区。 函数可以处理任何维度的字段。
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');
第 2 步:模拟模糊
模拟可能模糊的真实图像(例如,由于 DSLR 运动或缺乏焦点)。 此示例通过将高斯混合器与频域中的真实图像相结合来模拟模糊(使用 )。 之后,高斯混合器表示点扩散函数 PSF。
PSF = fspecial('gaussian',7,10);
Blurred = imfilter(I,PSF,'symmetric','conv');
imshow(Blurred)
title('Blurred Image')
第 3 步:使用各种尺寸的 PSF 恢复模糊图像
为了说明了解真实 PSF 大小的重要性,此示例执行了三个恢复。 每个 PSF 重建都以一个统一字段(链表)开始。
第一次恢复 J1 和 P1,使用较小的字段作为 PSF 的初始猜测。 字段的每个维度规范都比真实 PSF 少 4 个像素。
UNDERPSF = ones(size(PSF)-4);
[J1,P1] = deconvblind(Blurred,UNDERPSF);
imshow(J1)
title('Deblurring with Undersized PSF')
第二次恢复 J2 和 P2,对原始 PSF 使用由 1 组成的字段摩擦力的图像分析,其每个位维度的规格比实际 PSF 长 4 个像素。
OVERPSF = padarray(UNDERPSF,[4 4],'replicate','both');
[J2,P2] = deconvblind(Blurred,OVERPSF);
imshow(J2)
title('Deblurring with Oversized PSF')
第三个恢复 J3 和 P3,使用由 1 组成的字段来形成与实际 PSF 大小完全相同的初始 PSF。
INITPSF = padarray(UNDERPSF,[2 2],'replicate','both');
[J3,P3] = deconvblind(Blurred,INITPSF);
imshow(J3)
title('Deblurring with INITPSF')
第 4 步:剖析恢复的 PSF
所有三个减少也形成 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')
在第一次恢复中重组的 PSFP1 似乎不符合约束规范。 边界处的信号差异很大。 与模糊图像相比,相应的图像 J1 没有显示出任何改进的清晰度。
在第二个补丁中重建的 PSFP2 具有非常平滑的边缘。 这意味着恢复可以处理较小格式的 PSF。 相应的图像 J2 显示出一些去模糊,但被振铃严重损坏。
最后,在第三个补丁中重构的 PSFP3 位于 P1 和 P2 之间。 阵列 P3 非常类似于真实的 PSF。 对应图像J3明显提升; 并且它一直被振铃效应破坏。
第五步:提高修复效果
恢复图像J3中的振铃出现在图像中硬度对比鲜明的区域和图像边界处。 此示例说明如何通过指定加权函数来增加振铃。 该算法在恢复图像和 PSF 时根据数组对每个像素进行加权。 在我们的例子中摩擦力的图像分析,我们首先使用边缘函数来寻找“清晰”的像素。 通过反复试验,我们确定理想的阈值水平为 0.08。
WEIGHT = edge(Blurred,'sobel',.08);
为了扩大面积,我们使用并传入一个结构元素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')
通过使用链表调用函数并减少迭代次数 (30) 来恢复图像。 几乎所有的振铃效应都被抑制了。
[J,P] = deconvblind(Blurred,INITPSF,30,[],WEIGHT);
imshow(J)
title('Deblurred Image')
第 6 步:对 PSF 恢复使用附加约束
此示例说明如何在 PSF 上指定其他约束。 下面的函数 FUN 返回更改后的 PSF 字段,用于下一次迭代。
在这种情况下,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。 有关为函数提供附加参数的信息,请参阅文档中函数 FUN 的“参数化函数”部分。
在此示例中,初始 PSF 的大小比实际 PSF 大 4 个像素。 在 FUN 上设置 P1=2 和 P2=2 作为参数,使有价值的空间与真正的 PSF 大小相同。 因此,生成的 JF 和 PF 类似于反频域结果(步骤 4 中的 J 和 P),具有正确的 PSF 大小并且没有 FUN 调用。
[JF,PF] = deconvblind(Blurred,OVERPSF,30,[],WEIGHT,FUN);
imshow(JF)
title('Deblurred Image')
如果我们使用过大的初始 PSF,但缺少约束函数 FUN,则得到的图像将类似于步骤 3 中得到的不令人满意的结果 J2。
请注意,可以省略 FUN 之前的任何未指定参数,例如本例中不必要的占位符 ([])。
注:本文根据官网内容有所改动。
以下免费视频教程的特点是无PPT,无水,直接编程环境下的实战课程:
欢迎您进一步了解以下系列文章: