【发布时间】:2017-07-06 21:53:12
【问题描述】:
我在我的脚本中使用cv2 和Pillow:
image = Image.open("img1.png")
#do some stuff to the image
image.save("result1.png")
image = cv2.imread("result1.png")
kernel = np.ones((5, 5), np.uint8)
dilated_image = cv2.dilate(image, kernel, iterations=3)
cv2.imwrite("result2.png", dilated_image)
final_image = Image.open("result2.png")
#do some other stuff to the image
final_image.save("final_result.png")
如您所见,我必须在OpenCV 和Pillow 之间切换,并保存三张图片。我想要的是只保存 一个 结果,而不是 三个。
有没有办法,我可以继续使用 Pillow,以几乎相同的执行速度放大图像,而不使用 cv2?
我已经尝试过image.filter(ImageFilter.MaxFilter(size=3)),但是它占用了太多的 CPU 时间。时间太长的原因是为了和cv2.dilate(image, kernel, iterations=5)一样的效果,我至少应该用image.filter(ImageFilter.MaxFilter(size=15))
【问题讨论】:
-
这个函数
PIL.ImageFilter.MaxFilter怎么样? -
@ikkuh 我已经尝试过了,但速度要慢得多,因为与 cv2 相比,迭代应该更大
-
为什么不手动实现形态学操作?
-
@JohnSmith 在我看来
ImageMorph模块是最接近的——查看tests。不幸的是,它似乎只支持 3x3 内核。 | “在 CPU 时间上没有变慢”——怀疑。 OpenCV 的实现是手动矢量化的,粗略地看,在 Pillow 代码库中没有什么能接近这种优化水平。而且你用纯 Python 编写的任何东西都无法达到速度。 -
正如@DanMašek 所说,通过手动实现,您无法匹配速度。如果您想避免使用 OpenCV,SciPy 是您的最佳选择。否则,您将需要放弃您的一项要求。在 OpenCV 上复制
iterations的最简单方法是手动迭代 Pillow 函数iterations次。