我有以下问题:
我在过滤之前有一个输入图像,在过滤之后有一个输出图像。
我喜欢根据输入和输出图像找到过滤器内核。
我在Python中发现了一个类似的问题:Python find convolution kernel if input image and output image is known,但我不理解该解决方案。
假设以下MATLAB代码:
I = double(imread('cameraman.tif'));
h = [1 2 3 2 1]/9;
J = imfilter(I, h);
现在,假设我知道图像I
和J
,并且我想找到卷积核h
。
假设我知道内核大小为1x5。
如何使用MATLAB查找内核值(h = [1 2 3 2 1]/9
)?
我想出了如何使用线性方程组来解决它:
A = I(1, :);
B = J(1, :);
a1 = A(1);a2 = A(2);a3 = A(3);a4 = A(4);a5 = A(5);a6 = A(6);a7 = A(7);a8 = A(8);a9 = A(9);
b3 = B(3);b4 = B(4);b5 = B(5);b6 = B(6);b7 = B(7);
% Linear equations system:
% b3 = h1*a1 + h2*a2 + h3*a3 + h4*a4 + h5*a5
% b4 = h1*a2 + h2*a3 + h3*a4 + h4*a5 + h5*a6
% b5 = h1*a3 + h2*a4 + h3*a5 + h4*a6 + h5*a7
% b6 = h1*a4 + h2*a5 + h3*a6 + h4*a7 + h5*a8
% b7 = h1*a5 + h2*a6 + h3*a7 + h4*a8 + h5*a9
% Representation as a Matrix by Vector multiply:
% [b3] = [a1 a2 a3 a4 a5] [h1]
% [b4] = [a2 a3 a4 a5 a6] [h2]
% [b5] = [a3 a4 a5 a6 a7] * [h3] = A * h
% [b6] = [a4 a5 a6 a7 a8] [h4]
% [b7] = [a5 a6 a7 a8 a9] [h5]
%
% Solution:
% h = [h1; h2; h3; h4; h5]
% b = [b3; b4; b5; b6; b7]
%
% h = inv(A)*b
A = [a1 a2 a3 a4 a5
a2 a3 a4 a5 a6
a3 a4 a5 a6 a7
a4 a5 a6 a7 a8
a5 a6 a7 a8 a9];
b = [b3; b4; b5; b6; b7];
h_est = A \ b;
结果:
h_est = [1 2 3 2 1]'/ 9
答案 0 :(得分:0)
可以通过以下方式获得近似解:将输入和输出通过fft2
转换到频域,按元素划分,然后转换回:
sz = [1 5]; % size of kernel. Assumed to be odd on both dimensions
t = ifft2(fft2(J)./fft2(I));
h_est = t([end-floor(sz(1)/2)+1:end 1:floor(sz(1)/2)+1], [end-floor(sz(2)/2)+1:end 1:floor(sz(2)/2)+1]);
这给出了内核的近似版本。错误是由于imfilter
应用了 linear 卷积丢弃边而不是 circular 卷积
h_est =
0.110802383990180 0.220778630937971 0.334647389362831 0.222063075848356 0.110536502695893
h =
0.111111111111111 0.222222222222222 0.333333333333333 0.222222222222222 0.111111111111111