与标准(以及更具挑战性)去模糊和超分辨率场景不同,我可以访问原始(清晰)图像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时通常会以线性约束或正则化元素的形式出现.