【问题标题】:Calculating the blur kernel between 2 images计算两张图像之间的模糊核
【发布时间】:2013-12-27 20:35:25
【问题描述】:

与标准(并且更具挑战性)去模糊和超分辨率场景不同,我可以访问原始(清晰)图像G 和它的模糊版本B。我只是在寻找模糊内核h。所以因为B是使用真实相机拍摄的,所以关系是:

B=G*h+N   (其中* 表示卷积,N 是一些加性噪声)

当然,这是一个过度约束的问题,因为与 GB 相比,h 的尺寸较小,因此这对图像中的每几个像素都会在 h 的条目上生成一个方程。

但实际实现这一点的最简单方法是什么?到目前为止我的想法:

  • 移动到频域并进行除法(正如this answer 建议的那样)。但这不可避免地会因为噪声而在数值上不稳定,对吧?
  • 互相关 - 我只找到了一维信号的示例,不知道如何在图像的二维情况下使用。
  • 使用一些优化程序仔细构造一个过度约束的线性系统G'h'=B' 寻找h',它是内核h 条目的向量版本。但这非常繁琐,矩阵G' 和向量B' 的大小势必很大。

从 C++ 到 MATLAB 的任何编程语言的具体示例都非常有用。

【问题讨论】:

  • 在第一种方法中,我认为噪音不会使结果在数值上不稳定。但这只是猜测
  • 为什么你认为在现实场景中h 对所有像素都是固定的?
  • 我建议看一下:wisdom.weizmann.ac.il/~levina/papers/deconvLevinEtalCVPR11.pdf - 那里解决的问题更复杂,他们不假设知道G,但他们有一套明确恢复h 可能是有用
  • @Shai,我不认为h 在整个图像中是恒定的,事实上,简单的实验表明并非如此。但是,我有兴趣获得一些全局近似值。Anat 论文中的 M 步(他的办公室在我的几扇门旁边 :))利用一个简单的二次规划问题似乎最相关。我正在努力使她的代码适应一个简单的函数,产生h 给定BG。会在我开始体面工作时发布。
  • @Stav 向 Anat 致以问候。

标签: matlab image-processing signal-processing convolution cross-correlation


【解决方案1】:

使用@Shai的相关建议,我现在可以给出详细的答案了。

我建议的选项 2 和 3 实际上是相同的,并且显然是正确的方法。这也是@Shai 链接的建议论文的 E 步骤中所做的。提出过度约束问题其实很简单。

为了正确地提出这些方程,我们使用以下事实:每个块的点积(内核大小以G 中的某个像素为中心)与h 的 180 度旋转版本应该等于@987654323 中的相应像素@。这直接源于BG 通过卷积相关的事实,因此G 中的块通过互相关与B 中的像素相关(因此是180 度旋转)。

MATLAB 代码现在变为:

%inputs: B,G - gray level blurred and sharp images respectively (double)
%        szKer - 2 element vector specifying the size of the required kernel
%outputs: mKer - the recovered kernel, 
%         imBsynth - the sharp image convolved with the recovered kernel
%
%example usage:  mKer = calcKer(B, G, [11 11]);

function [mKer, imBsynth] = calcKer(B, G, szKer)

  %get the "valid" pixels from B (i.e. those that do not depend 
  %on zero-padding or a circular assumption
  imBvalid = B(ceil(szKer(1)/2):end-floor(szKer(1)/2), ...
      ceil(szKer(2)/2):end-floor(szKer(2)/2));

  %get a matrix where each row corresponds to a block from G 
  %the size of the kernel
  mGconv = im2col(G, szKer, 'sliding')';

  %solve the over-constrained system using MATLAB's backslash
  %to get a vector version of the cross-correlation kernel
  vXcorrKer = mGconv \ imBvalid(:);

  %reshape and rotate 180 degrees to get the convolution kernel
  mKer = rot90(reshape(vXcorrKer, szKer), 2);

  if (nargout > 1)
      %if there is indeed a convolution relationship between B and G
      %the following will result in an image similar to B
      imBsynth = conv2(G, mKer, 'valid');
  end

end

我还发现在实际场景中可能需要对解决方案进行一些限制。示例是强制内核为正、平滑或对称。合并这些的确切方法超出了这个问题的范围,但在求解vXcorrKer 时通常会以线性约束或正则化元素的形式出现。

【讨论】:

  • 如何将其视为一个优化问题,其中明确定义似然性(因为目标图像已知)并且将非负性和平滑性(例如 L1 范数)约束作为正则化。
猜你喜欢
  • 2020-04-25
  • 2012-03-24
  • 1970-01-01
  • 2012-03-20
  • 2014-06-01
  • 2021-05-26
  • 1970-01-01
  • 2013-06-18
  • 2012-12-07
相关资源
最近更新 更多