【发布时间】:2019-05-22 17:22:33
【问题描述】:
我有以下代码将高斯滤波器应用于任意图像 25 次。每次应用过滤器时,都会对生成的图像进行归一化。
kernel = np.array([[1.0,2.0,1.0],
[2.0,4.0,2.0],
[1.0,2.0,1.0]])
for i in range(25):
# handle each component separately
img[:,:,0] = convolve(img[:,:,0], kernel, mode='same')
img[:,:,1] = convolve(img[:,:,1], kernel, mode='same')
img[:,:,2] = convolve(img[:,:,2], kernel, mode='same')
img = img / 16 # normalize
扭转这一过程的最佳方法是什么? IE。如果我有一个模糊的图像(执行上面的代码的结果)并且想要获得原始图像。
编辑 1:
例子
编辑 2:
尝试复制克里斯的答案
我安装了dipimage_2.9。我正在使用macOS 10.14.2 和Matlab R2016a。
我花了一段时间才知道如何为卷积指定边界条件,因为 DIPimage 的 convolve.m 只接受 image_in 和 kernel 参数。我最终为此使用了dip_setboundary(DIPimage User Manual 第 9.2 节)。
这是代码(我只是相应地添加了dip_setboundary 和cut 的裁剪区域的起源):
% Get data
a = readim('https://i.stack.imgur.com/OfSx2.png'); % using local path in real code
a = a{1}; % Keep only red channel
%% Create kernel
kernel = [1.0,2.0,1.0
2.0,4.0,2.0
1.0,2.0,1.0] / 16;
tmp = deltaim((size(kernel)-1)*25+1);
dip_setboundary('add_zeros');
for ii=1:25
tmp = convolve(tmp,kernel);
end
kernel = tmp;
%% Apply convolution
dip_setboundary('periodic');
b = convolve(a,kernel);
dip_setboundary('symmetric'); % change back to default
% Find inverse operation
% 1- pad stuff so image and kernel have the same size
% we maintain the periodic boundary condition for image b
b = repmat(b,ceil(imsize(kernel)./imsize(b)));
kernel = extend(kernel,imsize(b));
% 2- apply something similar to Wiener deconvolution
c = real(ift(ft(b)/(ft(kernel)+1e-6))); % Not exactly Wiener, but there's no noise!
% 3- undo padding
c = cut(c,imsize(a), [0, 0]); % upper left corner
这是生成的图像c:
【问题讨论】:
-
模糊是一个损失过程 - 你不能 100% 逆转它 - 本质上它是将周围单元格的值与当前单元格合并并取平均值
-
@PatrickArtner 我怀疑这一点。即使我知道用于模糊图像的确切滤镜也是如此吗?
-
寻找反卷积。维纳反卷积是解决这个问题的最简单的方法。逆过程(通常)并不完美,因为卷积可能丢失信息。理解傅里叶分析对于理解反卷积很重要。
-
@CrisLuengo 我学过信号处理,所以对此有一个大致的了解。我实际上尝试了 Wiener 反卷积,但结果并不好。在这种情况下,我担心的是,为了模糊卷积和归一化会一次又一次地应用很多次。因此,简单地使用相同的内核应用反卷积是不够的。
-
如果我今天晚些时候找到时间并且这个问题还没有得到回答,我会写一个答案来说明如何在这种情况下应用反卷积。
标签: python matlab image-processing scipy convolution