飞码网-免费源码博客分享网站

点击这里给我发消息

基于matlab图像去模糊介绍

飞码网-免费源码博客分享网站 本篇文章由飞码网制作上传,转载请标注来源: 飞码网-免费源码社区:https://www.codefrees.com 严禁非法转载! 本篇文章由飞码网制作上传,转载请标注来源: 飞码网-免费源码社区:https://www.codefrees.com 严禁非法转载! 飞码网-免费源码博客分享网站
        图像去模糊(或恢复)是图像处理中的一个老问题,但它仍然吸引着研究人员和从业人员的关注。从天文学到消费类成像等许多现实世界的问题都能找到图像修复算法的应用。另外,图像修复是一类更大的逆向问题的一个容易可视化的例子,这些问题出现在各种科学、医学、工业和理论问题中。除此之外,将一个算法应用到模糊的图像上,然后马上就能看到你做得如何,这就是一种乐趣。

         要对图像进行去模糊处理,我们需要对图像是如何模糊的进行数学描述。(如果没有的话,有一些算法可以估计模糊的程度。但那是另一天的事了)。) 我们通常从一个移位不变的模型开始,这意味着原始图像中的每一个点在形成模糊图像时都以同样的方式扩散。我们用卷积来建模。
       g(m,n) = h(m,n)*f(m,n) + u(m,n)
       其中*是二维卷积,h(m,n)是点扩散函数(PSF),f(m,n)是原始图像,u(m,n)是噪声(通常认为是独立的同分布高斯)。这个方程起源于连续空间,但为了方便起见,已经进行了离散化处理。
       实际上,模糊图像通常是上述输出g(m,n)的窗口化版本,因为原始图像f(m,n)在矩形数组外通常不是零。让我们继续合成一个模糊的图像,这样我们就有东西可以使用了。如果我们假设f(m,n)是周期性的(通常是一个相当糟糕的假设!),卷积就变成了循环卷积,可以通过卷积定理用FFT实现。

       如果我们用几何光学来模拟焦外模糊,就可以用fspecial得到PSF,然后实现循环卷积。

     将PSF形成一个半径为3像素的圆盘。
h = fspecial('disk',4);
% Read image and convert to double for FFT
cam = im2double(imread('cameraman.tif'));
hf = fft2(h,size(cam,1),size(cam,2));
cam_blur = real(ifft2(hf.*fft2(cam)));
imshow(cam_blur)


通过适当的设置,使用imfilter也可以计算出类似的结果。

你会立即注意到,循环卷积导致裤子和三脚架缠绕在一起,模糊到天空中。我告诉过你,输入图像的周期性是一个糟糕的假设! :-) 但我们暂时不担心这个问题。

现在我们需要添加一些噪声。如果我们将峰值SNR(PSNR)定义为

PSNR=10log_{10}\frac{[gmax-gmin]^{2}}{\sigma_{u}^{2}}

那么,噪声比例由以下公式给出

\sigma _{u} = 10^{-PSNR/20}|gmax-gmin|

现在我们添加噪声来获得40dB的PSNR。
sigma_u = 10^(-40/20)*abs(1-0);
cam_blur_noise = cam_blur + sigma_u*randn(size(cam_blur));
imshow(cam_blur_noise)

反滤波器是解决去模糊问题的最简单的方法。如果我们忽略噪声项,我们可以通过除以h(m,n)的FFT,并对结果进行反向FFT来实现反。从事图像修复工作的人都喜欢从逆向滤波器开始。因为它很简单,但结果绝对是可怕的!这意味着,任何新的和改进的图像修复算法相比之下总是看起来很好! 让我来告诉你我的意思。
 
cam_inv = real(ifft2(fft2(cam_blur_noise)./hf));
imshow(cam_inv)

一定是出了什么问题,对吗?嗯,代码肯定没有错。但如果我们认为可以忽略噪声,那肯定是错的。看看PSF的频率响应幅度就知道为什么了。
 
hf_abs = abs(hf);
surf([-127:128]/128,[-127:128]/128,fftshift(hf_abs))
shading interp, camlight, colormap jet
xlabel('PSF FFT magnitude')

我们马上看到,模糊的幅度响应有一些非常低的值。当我们除以这个点时,我们也是在除以这些低值的加法噪声项,导致噪声的巨大放大--足以完全淹没图像本身。

现在我们可以应用一个非常简单的技巧来尝试我们的这非常令人满意的改进。我们只需将反滤波结果中PSF频率响应低于阈值的频率成分清零即可。
 
cam_pinv = real(ifft2((abs(hf) > 0.1).*fft2(cam_blur_noise)./hf));
imshow(cam_pinv)
xlabel('pseudo-inverse restoration')

为了比较的目的,我们重复模糊和噪声图像。
imshow(cam_blur_noise)
xlabel('blurred image with noise')

这个结果显然比第一次尝试要好得多!它仍然包含噪音,但水平低得多。它仍然包含噪音,但水平低得多。这不是戏剧性的和令人满意的,但这是在正确的方向上迈出的一步。你可以看到一些失真,这是由于一些频率没有被还原的事实。一般来说,一些较高的频率已经被消除了,这导致了一些模糊的结果以及铃声。铃声是由于吉布斯现象造成的--由于频率的缺失,阶梯状的过渡变得 "波浪形"。

使用不同形式的伪逆滤波器可以得到类似但略有改进的结果。通过在被除数上加上一个小数字delta^2,我们得到的数字几乎是一样的,除非这个数字与delta^2在同一范围内或小于delta^2。也就是说,如果我们让

H1=\frac{H^{*}}{|H|^{2}+\sigma ^{2}}
然后
H1\approx \frac{1}{H} if|\sigma |\ll |H|


H1\approx0 if|\sigma |\ll |H|

这和之前的伪逆滤波器一样,但两个极端之间有一个平滑的过渡。要在MATLAB中实现,我们是这样做的。
 
cam_pinv2 = real(ifft2(fft2(cam_blur_noise).*conj(hf)./(abs(hf).^2 + 1e-2)));
imshow(cam_pinv2)
xlabel('alternative pseudo-inverse restoration')

如你所见,这能产生更好的效果。这是由于在频率分量的还原和噪声平滑之间有了更平滑的过渡。

我希望在未来的博客中看一些进一步的改进,以及一些处理更多现实世界假设的策略。
飞码网-免费源码博客分享网站 本篇文章由飞码网制作上传,转载请标注来源: 飞码网-免费源码社区:https://www.codefrees.com 严禁非法转载! 本篇文章由飞码网制作上传,转载请标注来源: 飞码网-免费源码社区:https://www.codefrees.com 严禁非法转载! 飞码网-免费源码博客分享网站
赞 ()
内容页底部广告位3
留言与评论(共有 0 条评论)
   
验证码: