我想用一个简单的卷积内核在python枕头中过滤一个图像。然而,为了达到最佳结果,我需要一个9x9内核。这是枕头中的不可能,至少在使用ImageFilter.Kernel和内置filter()方法时是如此,这两种方法仅限于5x5内核。
如果没有实现我自己的卷积代码,是否有一种方法可以过滤/转换内核大小大于5x5的图像?
发布于 2015-07-17 13:13:31
我很惊讶地看到PIL没有超过5x5内核的支持。因此,谨慎地考虑其他Python包,例如OpenCV或scipy.为了节省时间,让我们使用scipy。OpenCV很难配置,尽管它非常强大。
我建议使用scipy从imread包加载映像,并将映像与内核进行转换,然后在完成后转换为PIL映像。从convolve包中使用ndimage,然后通过Image.fromArray将其转换回PIL映像。它确实支持转换numpy.ndarray (这是使用scipy.ndimage.imread时加载的),这是很棒的。
就像这样,假设一个9×9的平均滤波器:
# Import relevant packages
import numpy as np
from scipy import ndimage
from PIL import Image
# Read in image - change filename to whatever you want
img = ndimage.imread('image.jpg')
# Create kernel
ker = (1/81.0)*np.ones((9,9))
# Convolve
out = ndimage.convolve(img, ker)
# Convert back to PIL image
out = Image.fromArray(out, 'RGB')发布于 2017-05-03 12:07:49
比维普斯是另一种选择,如果你没有被绑在枕头上,松软的或者是枕木的话。它速度更快,需要更少的内存,特别是对于较大的图像。它也会打败opencv的,至少在某些基准上。
我试过这台笔记本电脑:
import sys
import numpy as np
from scipy import ndimage
from PIL import Image
img = ndimage.imread(sys.argv[1])
ker = (1 / 81.0) * np.ones((9, 9))
out = ndimage.convolve(img, ker)
out = Image.fromarray(out)
out.save(sys.argv[2])我可以这样运行:
$ /usr/bin/time -f %M:%e ./try257.py ~/pics/wtc-mono.jpg x.jpg
300352:22.47因此,2015年i5笔记本电脑上的10kx10k像素单jpg大约需要22秒,并且需要300 of的最大内存。
在比目鱼里是:
import sys
import pyvips
im = pyvips.Image.new_from_file(sys.argv[1], access="sequential")
size = 9
kernel = size * [size * [1.0 / (size * size)]]
im = im.conv(kernel)
im.write_to_file(sys.argv[2])我看到:
$ /usr/bin/time -f %M:%e ./try258.py ~/pics/wtc-mono.jpg x.jpg
44336:4.76大约5秒45 of的内存。
这是一个浮子卷积。您可以将其交换为int精度,如下所示:
im = im.conv(kernel, precision="integer")我看到:
$ /usr/bin/time -f %M:%e ./try258.py ~/pics/wtc-mono.jpg x.jpg
44888:1.791.8秒
https://stackoverflow.com/questions/31432443
复制相似问题