Python 使用 numpy 切片的图像卷积在某些图像上产生奇怪的结果
Python image convolution with numpy slices produces strange results on some images
我正在尝试使用 Numpy 在 GIMP 的插件中实现卷积,但我得到了一些奇怪的结果。
给我出问题的函数是这个:(它只在灰度图像上运行)
def convolve(self, pixels, kernel):
bw, bh = pixels.shape
k_w, k_h = kernel.shape
if (k_w != k_h):
raise ValueError("Passed kernel is not of the right shape")
#expand the image
bigger = np.lib.pad(pixels, int(k_w/2), 'reflect').astype(np.float)
pixels.fill(0)
pixels = pixels.astype(np.float)
for x in range(k_w):
for y in range(k_h):
pixels += kernel[x,y]*bigger[x : bw + x,
y : bh + y]
return np.clip(pixels,0,255).astype(np.uint8)
不知何故,对于某些图像尺寸,输出变得一团糟。具体示例可以是在此图像上应用 5x5 高斯模糊时:
输入:
输出不正确:
最奇怪的是,对于很多图像——尤其是方形图像——插件工作正常。例如,如果我在 GIMP 中手动将图像扩展为正方形,我会得到正确模糊的图像:
我尝试将 numpy 数组的大小调整为正方形,然后将其裁剪回去,但令人惊讶的是,这并没有解决问题。
编辑:目前 运行 代码如下:
self.convolve(pixels,
np.array([
[ 1, 4, 6, 4, 1,],
[ 4,16,24,16, 4,],
[ 6,24,36,24, 6,],
[ 4,16,24,16, 4,],
[ 1, 4, 6, 4, 1,],
], dtype=np.float)*1/256)
但是任何 3x3 过滤器都会出现同样的问题,像这样的内核工作正常
[ 0, 0, 0,],
[0.5, 0, 0.5,],
[ 0, 0, 0,],
这样的内核会产生奇怪的问题:
[ 0, 0.5, 0,],
[ 0, 0, 0,],
[ 0, 0.5, 0,],
找到问题了!问题是由于错误地将数据从 GIMP 解析为 numpy 数组引起的。不小心交换了数组的维度,导致过滤器出现一些奇怪的行为。
我正在尝试使用 Numpy 在 GIMP 的插件中实现卷积,但我得到了一些奇怪的结果。
给我出问题的函数是这个:(它只在灰度图像上运行)
def convolve(self, pixels, kernel):
bw, bh = pixels.shape
k_w, k_h = kernel.shape
if (k_w != k_h):
raise ValueError("Passed kernel is not of the right shape")
#expand the image
bigger = np.lib.pad(pixels, int(k_w/2), 'reflect').astype(np.float)
pixels.fill(0)
pixels = pixels.astype(np.float)
for x in range(k_w):
for y in range(k_h):
pixels += kernel[x,y]*bigger[x : bw + x,
y : bh + y]
return np.clip(pixels,0,255).astype(np.uint8)
不知何故,对于某些图像尺寸,输出变得一团糟。具体示例可以是在此图像上应用 5x5 高斯模糊时:
输入:
输出不正确:
最奇怪的是,对于很多图像——尤其是方形图像——插件工作正常。例如,如果我在 GIMP 中手动将图像扩展为正方形,我会得到正确模糊的图像:
我尝试将 numpy 数组的大小调整为正方形,然后将其裁剪回去,但令人惊讶的是,这并没有解决问题。
编辑:目前 运行 代码如下:
self.convolve(pixels,
np.array([
[ 1, 4, 6, 4, 1,],
[ 4,16,24,16, 4,],
[ 6,24,36,24, 6,],
[ 4,16,24,16, 4,],
[ 1, 4, 6, 4, 1,],
], dtype=np.float)*1/256)
但是任何 3x3 过滤器都会出现同样的问题,像这样的内核工作正常
[ 0, 0, 0,],
[0.5, 0, 0.5,],
[ 0, 0, 0,],
这样的内核会产生奇怪的问题:
[ 0, 0.5, 0,],
[ 0, 0, 0,],
[ 0, 0.5, 0,],
找到问题了!问题是由于错误地将数据从 GIMP 解析为 numpy 数组引起的。不小心交换了数组的维度,导致过滤器出现一些奇怪的行为。