与标准(且更具挑战性)去模糊和超分辨率场景不同,我可以访问原始(清晰)图像G
和模糊版本B
。我只是在寻找模糊内核h
。因为B
是使用真实相机拍摄的,因此关系是:
B=G*h+N
(其中*
表示卷积,N
是一些加性噪音)
当然,这是一个过度约束的问题,因为h
与G
和B
相比尺寸较小,因此图像对中的每几个像素都会生成一个等式h
的条目。
但实际实现这个的最简单方法是什么?到目前为止我的想法:
G'h'=B'
,寻找h'
,它是内核h
条目的矢量版本。但这非常繁琐,矩阵G'
和向量B'
的大小必然很大。从C ++到MATLAB的任何编程语言的具体例子都非常有用。
答案 0 :(得分:2)
使用@ Shai的相关建议,我现在可以给出详细的答案。
我建议的选项2和3实际上是相同的,显然是正确的方法。这也是由@Shai链接的建议论文的E步骤所做的。提出过度约束的问题实际上非常简单。
为了正确地构建这些方程式,我们使用以下事实:内核大小的每个块的点积以G
中的某个像素为中心,并且h
的180度旋转版本应该等于相应的B
中的像素。这直接源于B
和G
通过卷积相关的事实,因此G
中的块与B
中的像素通过互相关(因此180) -degree rotation)。
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
时通常会以线性约束或正则化元素的形式出现。