使用MATLAB查找给定输入和输出图像的滤镜内核

时间:2019-05-19 16:18:38

标签: matlab image-processing

我有以下问题:
我在过滤之前有一个输入图像,在过滤之后有一个输出图像。
我喜欢根据输入和输出图像找到过滤器内核。

我在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);

现在,假设我知道图像IJ,并且我想找到卷积核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

1 个答案:

答案 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