欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

2011-CVPR - Blind deconvolution using a normalized sparsity measure

程序员文章站 2022-03-07 20:47:32
项目地址:https://dilipkay.wordpress.com/blind-deconvolution/图像先验:ℓ1/ℓ2\ell_1/\ell_2ℓ1​/ℓ2​(normalized version of ℓ1\ell_1ℓ1​),模糊核先验:ℓ1\ell_1ℓ1​x更新:iterative shrinkage-thresholding algorithm(ISTA)k更新:i......

项目地址:https://dilipkay.wordpress.com/blind-deconvolution/

  • 图像先验:1/2\ell_1/\ell_2(normalized version of 1\ell_1),模糊核先验:1\ell_1
  • x更新:iterative shrinkage-thresholding algorithm(ISTA)
  • k更新:iterative re-weighted least squares (IRLS)
  • 扩展到非一致性模糊
  • 在Levin(2009)库上做了测试

作者认为 利用1/2\ell_1/\ell_2正则化相比其他常见形式的图像先验更有利于清晰图像而不是模糊图像。
作者以高斯模糊为例(这里我存疑:对于运动模糊不一定适用)
2011-CVPR - Blind deconvolution using a normalized sparsity measure
横轴表示高斯模糊核大小,即模糊核越大越模糊。高斯核大小为负数表示图像锐化(即原图减去模糊后的图像,后附代码)。传送门:图像锐化算法-sharpen

先提取低频,原图减去低频得到高频。这种方法称为非锐化掩模(unsharpen mask),我们常使用低通滤波器(高斯、双边)对图像进行滤波,这种方法滤波器很好控制(包括大小和强弱),从而可以控制高频分量的强弱。

从上图中作者得出结论:1/2\ell_1/\ell_2对于清晰图像值很小,对于模糊图像值很大,根据能量最小化,算法更倾向于清晰图像,而其余先验反之。

  • 这里先解释为什么图像越模糊,1/2\ell_1/\ell_2值越小。
    作者说图像模糊会使图像梯度的1\ell_12\ell_2值都减小,但2\ell_2值减小的幅度更大。

这里我认为这种情况只适用于高斯模糊,因为高斯模糊确实使边缘变弱,但对于运动模糊而言,模糊虽然使得边缘变弱,但会使边缘出现偏移(重影现象),边缘数量反而增加,整体能量并不一定下降!(个人理解,1\ell_1大家不都在用嘛=。=)

正如文章所说,1/2\ell_1/\ell_21\ell_1归一化后的版本,具有尺度不变性。
个人理解:对强边缘和弱边缘的响应差距相对较小。比如某个像素的梯度为[-10,10],1=20\ell_1=201/2=2\ell_1/\ell_2=\sqrt2,另一个像素的梯度为[-1,-1],1=2\ell_1=21/2=2\ell_1/\ell_2=\sqrt2。显然1\ell_1响应差距更大。

1\ell_1 is scale variant so the norm can be minimized by simply reducing the signal.

模型优化

2011-CVPR - Blind deconvolution using a normalized sparsity measure
xxyy 分别为清晰图像 uu 和模糊图像 gg梯度图。

  • 更新xx时,将正则项的分母固定(看成常数),用上一次迭代的值,使用iterative shrinkage-thresholding algorithm(ISTA)算法解决。
  • 更新kk时,使用iterative re-weighted least squares (IRLS)算法解决。
  • 恢复最终清晰图像时使用超拉普拉斯先验(α=0.8\alpha=0.8λ=3000\lambda=3000)
    2011-CVPR - Blind deconvolution using a normalized sparsity measure

matlab 实现非锐化掩模(unsharpen mask)代码:

clear;
imSrc = imread('coloredChips.png');
imSrcYcbcr = rgb2ycbcr(imSrc);
imSrcY = imSrcYcbcr(:,:,1);
[hei, wid] = size(imSrc(:,:,1));
size = 3;
sigma = 1;  %gauss standard deviation sigma, default is 1
amount = 1.5;
threshold = 15;
gaussFilter = fspecial('gaussian', [size, size], sigma);
imSrcY_lf = imfilter(imSrcY, gaussFilter, 'symmetric');
imSrcY_hf = imSrcY - imSrcY_lf;
imLabel = (imSrcY_hf > threshold);
imLabel = uint8(imLabel);
imDstY = uint8(imSrcY + amount * imSrcY_hf .* imLabel);
figure, imshow([imSrcY, imSrcY_lf, imSrcY_hf, imDstY]);
imSrcYcbcr(:,:,1) = imDstY;
imDst = ycbcr2rgb(uint8(imSrcYcbcr));
figure, imshow([imSrc, imDst]);

本文地址:https://blog.csdn.net/u012938704/article/details/104347734