matlab – 计算2个图像之间的模糊内核

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

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

自然地,这是一个过度约束的问题,因为与G和B相比,h的尺寸较小,因此该对图像中的每几个像素在h的条目上生成等式.

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

>移动到频域并进行划分(如this answer所示).但由于噪音正确,这将不可避免地在数值上不稳定吗?
>互相关 – 我只找到了1-D信号的例子,无法弄清楚如何在图像的2D情况下使用.
>仔细构建过约束线性系统G’h’= B’使用一些优化过程寻找h’,它是内核h的条目的向量版本.但这非常繁琐,矩阵G’和矢量B’的大小必然很大.

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

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

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

为了正确地构造这些方程式,我们使用以下事实:每个块的点积,以G中的某个像素为中心的核的大小,以及180度旋转的h的版本应该等于B中的对应像素.这直接来自事实B和G通过卷积相关,因此G中的块通过互相关(因此180度旋转)与B中的像素相关.

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时通常会以线性约束或正则化元素的形式出现.

点赞