我想尝试编写一个简单的函数来平滑输入的图像。我尝试使用Image和numpy库来实现这一点。我认为使用卷积掩码是解决这个问题的方法,而且我知道numpy内置了convolve函数。
我该如何使用numpy.convolve来平滑一个图像?
我想尝试编写一个简单的函数来平滑输入的图像。我尝试使用Image和numpy库来实现这一点。我认为使用卷积掩码是解决这个问题的方法,而且我知道numpy内置了convolve函数。
我该如何使用numpy.convolve来平滑一个图像?
import scipy.signal
import numpy as np
import matplotlib.pyplot as plt
im = plt.imread('example.jpg')
im /= 255. # normalise to 0-1, it's easier to work in float space
# make some kind of kernel, there are many ways to do this...
t = 1 - np.abs(np.linspace(-1, 1, 21))
kernel = t.reshape(21, 1) * t.reshape(1, 21)
kernel /= kernel.sum() # kernel should sum to 1! :)
# convolve 2d the kernel with each channel
r = scipy.signal.convolve2d(im[:,:,0], kernel, mode='same')
g = scipy.signal.convolve2d(im[:,:,1], kernel, mode='same')
b = scipy.signal.convolve2d(im[:,:,2], kernel, mode='same')
# stack the channels back into a 8-bit colour depth image and plot it
im_out = np.dstack([r, g, b])
im_out = (im_out * 255).astype(np.uint8)
plt.subplot(2,1,1)
plt.imshow(im)
plt.subplot(2,1,2)
plt.imshow(im_out)
plt.show()
im /= 255.
这行注释掉。 - wimim = np.flipud(plt.imread('example.png'))
再次翻转它。 - wimim /= 255
并е°Ҷim_out * 255
жӣҙж”№дёәim_out.astype(np.uint8)
пјҢдҪ зҡ„её®еҠ©ж— д»·пјҢйқһеёёж„ҹи°ўпјҒ - Nickndimage
,它是 scipy
中的一个模块。它有许多滤波器函数,并提供用于卷积任意内核的封装。例如,img_gaus = ndimage.filters.gaussian_filter(img, 2, mode='nearest')
使用sigma为2的高斯滤波器对您的图像进行卷积。
如果您想对任意内核进行卷积,例如十字形
k = np.array([[0, 1, 0],
[1, 1, 1],
[0, 1, 0]])
img2 = ndimage.convolve(img, k, mode='constant')
这些函数同样适用于更高的维度,因此您可以使用几乎相同的代码(只需扩大内核的维度)来平滑处理更高维度中的数据。
scipy.signal.convolve2d
。 - wim