Python中的图像平滑
image-processing
numpy
python
10
0

我想尝试编写一个简单的函数来平滑输入的图像。我正在尝试使用Image和numpy库执行此操作。我以为使用卷积蒙版将是解决此问题的一种方法,并且我知道numpy内置了卷积函数。

如何使用numpy.convolve平滑图像?

参考资料:
Stack Overflow
收藏
评论
共 3 个回答
高赞 时间 活跃

你想看看ndimage ,这是一个模块scipy 。它具有许多设置为函数的过滤器,以及用于卷积任意内核的漂亮包装器。

例如,

img_gaus = ndimage.filters.gaussian_filter(img, 2, mode='nearest')

将您的图像与西格玛为2的西格玛进行卷积。

如果要卷积任意内核,请说一个叉

k = np.array([[0, 1, 0],
              [1, 1, 1],
              [0, 1, 0]])

img2 = ndimage.convolve(img, k, mode='constant')

这些函数也适用于更高维度,因此您可以使用几乎相同的代码(只是扩大内核的维度)来平滑更高维度的数据。

modecval参数控制卷积如何处理图像边缘的像素(对于边缘的像素,内核需要查看的区域的一半不存在,因此您需要选择一些东西来填充您的图像)图片出)。

收藏
评论

如果您不想使用scipy,则有以下三种选择:

1)由于numpy具有2D FFT,因此可以将卷积定理与傅立叶变换结合使用。

2)您可以使用可分离的内核,然后可以在展平的数组上进行两个一维卷积,一个在x方向进行卷积,另一个在y方向进行卷积(排列转置),这将产生与2D相同的结果卷积。

3)如果您有一个小的内核,例如3x3,那么只需将卷积写为乘法和总和就足够了。这听起来很麻烦,但还算不错。

如果您确实想使用scipy,则可以使用ngimage,正如tcaswell建议的那样。 scipy也有convolve2d。

收藏
评论

好问题!这里的tcaswell帖子是一个很好的建议,但是您不会从中学到太多,因为scipy会为您完成所有工作!由于您的问题是说您想尝试编写函数 ,因此我将向您展示一些更粗略和基本的手动方法,以期希望您能更好地了解卷积等背后的数学原理,然后再进行改进用自己的想法和努力!

注意:对于不同形状/大小的内核,您将获得不同的结果,高斯是通常的方法,但是您可以尝试其他一些有趣的方法(余弦,三角形等!)。我只是当场制作的,我认为它是一种金字塔形的。

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()

在此处输入图片说明

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号