Removing-Camera-Shake-from-a-Single-Photograph图像去模糊读书笔记
图片模型
The spatial relationships between the fuzzy graph B, the implicit structure L, and the core components K are defined as follows:
In this equation, B = K ⊗ L + N, the symbol ⊗ denotes the convolution operation under non-periodic boundary conditions, while N represents the noise contribution from each pixel's sensor.
基于成像过程的线性关系模型下进行假设研究。目标图像是L,在此框架下我们旨在通过观测数据B恢复得到目标图像是L,并无需具体信息K的信息支持。
在梯度维度上呈现重尾特性的自然图像,在附图中展示了一副自然图像及其各个像素点处的梯度幅度分布情况。分析结果表明,在这些图像中存在大量像素点其梯度强度较低或者为零。为了有效建模这一现象,在分析过程中采用了基于零均值的高斯混合模型来近似描述这些图像中的梯度分布特性。

重尾分布:梯度分布显著集中在较小数值区域,在较大数值上的出现概率高于高斯分布的情况。这也与我们的直觉相吻合,在大多数区域中呈现恒定或柔和的强度情况下梯度的整体变化较为平缓;然而,在边缘或边界处因遮挡现象的存在会产生较大的变化。
算法
总体框架
第一步:从输入的图片中提取模糊核,并采用由粗到细逐步细化的过程进行估计,在此过程中需注意防止出现局部极小点。
第二步:基于估计得到的核函数,通过标准卷积算法计算潜在的(Non-blurred)图像。
算法输入
- 模糊图像B项
- 在 fuzzy 图像中的一块 方块
- 最大尺寸限制 (以像素 表示)
- 对于 模糊 核 的方向 (水平 或垂直 ),我们 做出 初步 估计
预处理过程
在实验过程中,输入图像B需提前转换为线性色域。通过应用逆伽玛校正(γ=2.2),我们实现了色彩还原过程。对于单个像素值的计算公式如下:1Pixel value = (CCT value)^{1/γ}
if (GAMMA_CORRECTION~=1)
%%% gamma correct actual image
obs_im = (double(obs_im).^(GAMMA_CORRECTION))/(256^(GAMMA_CORRECTION-1));
else
obs_im = double(obs_im);
end
为了通过特定算法的方法来估算预期的模糊内核参数值,在处理原始图像时我们将其所有颜色通道数据整合到用户指定了的目标区域中从而生成一个具有灰度特性的模糊块P
模糊核的求法
基于灰度模糊块P,在研究过程中
\nabla P = \nabla L_p ⊗ K + noise
这里假设噪声满足方差为\sigma^2的高斯分布。
潜在图像的梯度p(\nabla L_p)由一个混合型C-零均值的高斯混合模型构成;其中满足第C个高斯分量具有方差为v_c和权重系数为π_c;通过引入稀疏性先验p(K)来设定内核矩阵,在确保所有元素非负的同时鼓励其内部稀疏特性;具体而言,在该模型中每个分量对应的比例因子被设定为\lambda_d而其权重系数则由\pi_d决定。
基于已知的梯度场\nabla P(其中梯度场\nabla P可以通过统计或测量手段获得),借助贝叶斯公式从而推导出后验概率分布。

其中i表示图像中的像素点部分;而j则表示模糊核部分;N和E各自代表高斯分布和指数分布。在处理过程中,在假设\nabla P彼此之间相互独立的情况下,则将\nabla L_p与k\kern-1px\text{类比}
为解决这一问题可将其视为一种最大后验概率模型,并旨在寻求核K与潜在图像的梯度∇L从而使后验概率p(K,∇L_p|∇p)最大化。这种方案等价于求解一个带正则化的最小二乘问题既企图拟合数据又使小梯度最小化此方案行不通
替代原先的后验分布p(K,\nabla L_p|\nabla p)以实现对潜在函数\nabla L_p和其梯度\nabla p的关系建模。通过最大边际概率计算核K。该方法选择了与潜在图像分布最相关的核集合,并因此有效地规避了基于单一“最佳”估计可能导致过拟合的问题。
为了更有效地计算这一近似值,在本研究中我们采用了变分贝叶斯方法,并用q(K,\nabla L_p)替代了传统的贝叶斯推断中的后验概率p(K,\nabla L_p|\nabla p)。该方法满足q(K,\nabla L_p)=q(K)q(\nabla L_p)这一因式分解条件。具体而言,在对潜在图像的空间分布建模时,默认假设其服从高斯密度;而对于非负模糊核元素这一情况,则采用了修正后的高斯分布模型来描述其概率特性。每个潜在图像及其模糊核元素的空间分布由均值向量和协方差矩阵参数化,并存储在一个数组中。此外,在实现过程中我们采用了Miskin和MacKay提出的盲解卷积技术作为基础框架
研究者建议,在评估阶段中将噪声变量\sigma^2视为一个未知量以实现降噪效果。这一方法使得噪声方差可以在估计过程中动态变化:早期阶段的数据拟合较为宽松;当找到更低噪声的解决方案时,约束条件变得更加严格。假设\sigma^2的逆方差服从Gamma分布的形式,并由超参数a和b控制,则有p(\sigma^2|a,b)=\Gamma(\sigma^2|a,b)。通过变分推断得到q(\sigma^2)作为其后验分布,并假设其服从另一个Gamma分布形式。
变分算法旨在估计模拟分布与真实分布之间的度量差距。即:KL(K,\nabla L_p,\sigma^2||p(K,\nabla L_p|\nabla p))。变分后验中的独立性假设下,则允许将成本函数C_{KL}进行因式分解:

其中<\cdot>_{q(\theta)} 代表q(\theta)^2。为简便起见,依赖∇p省略了。
q(K)与q(\nabla L_p)分布在均值位置指定为两个变量的位置,并且由于其较高的方差特性而表现出初始估计中的不确定性特征。随后通过坐标下降交替地进行分布参数 Update;其中一个是通过合并模型先验并同时边缘化另一个来进行 Update 的过程。具体而言,在每次迭代中,我们首先计算封闭形式的最佳参数 Update,并在此基础上进行精确的一维搜索以优化目标函数(详细内容请参考附录A)。这一过程持续进行直至KL散度的变化变得可接受。最终得到的结果即为变量K的空间平均估计值。
在上述讨论的基础上,在y = x^2这一模型中,在分析图像特征时,默认情况下并未考虑图像中存在的饱和像素这一特殊情况。这种未考虑到实际场景的现象确实带来了困扰,并与我们的模型预期不符。鉴于显式处理这类情况较为复杂且繁琐,在推理过程中我们倾向于采用更为简便的方式——即隐式地忽略这些区域的存在——这样就可以避免引入不必要的复杂性并简化运算过程
在变分框架设计中,在引入了C=D=4个相关组件后,在处理过程中考虑到了其对\nabla L_p的影响效果。潜在空间中的方差值v_c权重π_c是通过EM算法基于街景数据进行估计的结果,并且这一设定在所有实验场景中均得到了应用。考虑到不同尺度下的图像统计特性各异,在每个尺度级别上都有一组独立的先验参数设置。此设定在所有实验中均得到了应用。为了实现这一目标,在处理过程中引入了一种基于真实图像样本训练得出的低噪声核估计方法来确定模糊核元素的具体参数设置。
多尺度方法
该算法在上一节中受到局部极小值的影响, 尤其是在处理较大的模糊核时. 因此, 在进行图像分辨率调整的过程中采取了由粗到精的方式展开运算. 在这一阶段, 使用的是一个 3×3 大小的标准卷积核. 为了确保运算的有效性, 在设定初始参数时选择了两个不同的简单模式作为参考配置. 接着, 在保持卷积核尺寸不变的前提下, 运行推理过程以获得潜在梯度图像的初步估计.
然后我们回到金字塔,在每一层进行推理;其融合结果经过上采样处理并作为推理初始阶段的一部分在未来逐步扩展规模。
在最佳分辨率下,推理最终收敛于全分辨率的核K。
用户监督
然而,在理论上尝试使用完整的梯度图进行多尺度推理可能会显得不够自然。经过实验研究后发现,在实际应用中若人工选择包含复杂边缘特征的小区域,则能显著提升算法性能。这种人工选择的方式有助于避免大面积出现饱和或均匀的区域现象——这可能是由于算法缺乏足够的信息而导致的问题或是无意义的操作。此外,在处理一个小区域时相比全局处理而言该算法展现出显著的速度优势
另一个参数即为模糊内核的最大尺寸。在图像领域所存在的多种程度下焦现象之间存在显著的不同范围(从大约几到几百个像素)。当算法采用了一个极大尺寸作为初始设置时(即使得其无法有效处理微小程度下焦的问题),相反地当所选择的小尺寸作为初始设置时(会导致较大的下焦效果难以校正)。因此无论在何种情况下进行操作(核心尺寸设定应基于用户的输入需求),通过对图像中的伪影特征进行分析从而推断出最佳设置范围(即为所需设置的大致范围)。
最后,在模糊内核的两种初始估计(即水平线条和垂直线条)中选择一种是必要的。然而,在算法运行时通常可以在任意状态进行初始化,并且仍能生成正确的高分辨率内核;这将使算法从正确的方向开始搜索参数空间。通过识别图像中的模糊边缘部分(即模糊的内核工件),我们可以轻松地确定合适的初始值。
图像重建
L通常具有较大的规模,在处理速度方面提出了严格要求。为了节省时间,在保证图像质量的前提下,默认优先选择简单的方法作为初始方案。为此我们采用非盲反卷积算法RL(Reinforced Learning)对潜在的颜色信息进行重建工作,并成功地将该过程应用于生成高保真度彩色图像L的过程之中。与许多其他评估方法相比,在相同条件下该算法表现出更好的鲁棒性(计算时间仅为几分钟)。值得注意的是,在应用过程中必须确保反卷积过程满足泊松统计特性以保证重建质量。具体实现过程中采用Matlab编程框架完成相关运算,并经过10次迭代运行后得到最终结果矩阵L。值得注意的是,在实际应用中可能会出现收敛问题因此建议提前设置最大迭代次数以防止无限循环现象的发生。对于较大的模糊内核或者复杂的场景建议适当增加迭代次数以获得更好的效果。
附录


点评
文中对此进行了深入探讨,并对该方法的有效性与适用性发表了个人看法
以往的研究中将芒去卷积方法划分为三种类型:针对卷积核设定强约束、针对图像设定约束条件以及同时具备这两种特征的情况。此外,在处理较大的模糊核时不理想。Ferguson等人提出了一种完全不受限的方法,并实现了真正意义上实用的BID算法。本文将去模糊过程划分为两个步骤:首先是对卷积核进行估计以及随后执行去模糊操作。其中第二步可采用现有算法中的任意一种技术手段。本文的重点在于准确估计模糊核参数以及其空间位置参数的具体值。通过对清晰图像统计特性分析得出结论:清晰图像通常遵循特定分布模式;相反,在模糊状态下差异显著。基于此构建联合后验概率模型:该模型结合了观测到的信息与预先设定的知识,并在此基础上计算出最可能的状态组合即为目标解码结果提供依据。直接求解最大后验概率(MAP)问题效果并不理想因此作者采用学习方法:Miskin与MacKay提出的Ensemble Learning技术框架被引入其中作为主要贡献之一;
Fergus在其论文和演示文稿中均提及了一些结果。然而,在综合评估后发现这些成果整体上仍未能令人满意:其中部分恢复效果较为平庸,而另一些则因过高的噪声水平而显得实用性不足。尽管如此,在论文中作者也指出了多项值得进一步探索的方向(共分三类展开论述):(1)从模型设计层面来看:目前所采用的梯度模型仅考虑了相邻两点之间的统计特性,在这一方面的工作显得略显粗放;鉴于清晰图像往往满足重尾分布假设前提条件,在满足这一分布特征的情况下能否确保图像质量得到显著提升仍是一个值得深入研究的问题;此外针对出现的Gibbs现象的具体抑制措施尚待深入探讨。(2)从优化算法角度而言:目前所采用的MAP估计方法在计算复杂度上已接近最优但仍有较大的改进空间。(3)从技术路线选择上看:本文所采用的经典R-L算法虽然具有一定的理论价值但其在实际应用中的表现远非现代深度学习框架可比;未来研究应着重考察替代方案的表现潜力
MATLAB代码
- 首先读入图片,obs_im。
- 然后经过提取单通道或者grayscale得到单通道 的图,其中grayscale操作将大于250的像素值均变为了255。obs_im_orig为原obs_im。
- 将obs_im与obs_im_orig,事前resize,变为之前的1/2,使用的是bilinear插值法。
- 对obs_im经过gamma校正
- 强度变换
- 额外的模糊高斯变换(始终没有起作用)
- 根据像素值大于250的视为饱和,产生mask
- 是否自动寻找patch(默认无作用)
- CAMERA_TYPE是否为“unknown”(默认均为“unknown”)
- 如果COLOR有值,则转换YIQ 空间(默认无作用)
- 将obs_im与mask分别赋值给obs_im_all与mask_all
- 求图像的梯度。首先判断为harr算法或者laplace算子。进行卷积操作求出x与y方向上的卷积,接着组成整个梯度。
- 求\nabla p^s。根据事先给定的方块的位置,进行剪切。从obs_im_all中剪切出来指定的块赋值给obs_im,从mask_all中剪切出来特定的块赋值给mask。剪切出来x与y方向上的梯度分别赋值给obs_grad_x与obs_grad_y。判断条件跳入先梯度后恢复图像大小。求循环的scale梯度放置到数组obs_grad_scale_x与obs_grad_scale_y中,求循环的mask scale放置到mask_scale中。
- 将obs_grad_scale_x与obs_grad_scale_y按照s分别进行拼接放置到obs_grad_scale中。
- 求公式中的K^s,即求K的scale。由公式可得:K^{s-1}=\frac{1}{\sqrt{2}}K^{s}。K^s中的s等于1的时候,使用高斯在初始K^9进行卷积,然后resize。最终所有元素除以对应的最大值,完成归一化操作,赋值给blur_kernel_scale。
- 如果不是合成图像,则首先将obs_grad_scale赋值给obs_grad_scale_old;delta_kernel函数的作用是输入一个值,生成奇数(非奇数也要变成奇数)矩阵,矩阵中心的值为1。根据特定的s产生对应的db,根据fft2,ifft2产生新的obs_grad_scale与mask_scale。
- 统计K^s(blur_kernel_scale)的K(s)、L(s)、hK(s)与hL(s)。统计\nabla p^s(obs_grad_scale)的M(s)、N(s)。根据BLUR_COMPONENTS,K(s)\ast L(s),产生全零矩阵spatial_image_mask。根据size(mask_scale{s})产生全零矩阵spatial_image_mask。如果FFT_MODE为真,则由M(s)、N(s)产生I(s)、J(s),产生全零矩阵Dp{s},接着产生D(s)。
- 进行主循环,首先将priors进行扩展。接着调用MISKIN和MACKAY的算法
- 运行RL重建算法,还原图像
参考资料
基于单帧运动模糊图像的去模糊研究–Single Image Motion Deblurring
One more thing
更多相关内容涉及人工智能、Python、C++以及计算机领域等知识。如需进一步了解,请访问我的个人博客进行交流探讨,点这里~~
