【问题标题】:Alternative to .dilate() OpenCV.dilate() OpenCV 的替代方案
【发布时间】:2017-07-06 21:53:12
【问题描述】:

我在我的脚本中使用cv2Pillow

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

如您所见,我必须在OpenCVPillow 之间切换,并保存三张图片。我想要的是只保存 一个 结果,而不是 三个

有没有办法,我可以继续使用 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 次。

标签: python opencv pillow


【解决方案1】:

如果您只是在为标准库中的函数寻找 OpenCV 替代方案,那么您可以尝试 SciPy 的函数(SO Question here

【讨论】:

  • 我正在寻找 Pillow 替代品,因为我想用 Pillow 替换我的整个脚本
猜你喜欢
  • 2019-10-13
  • 1970-01-01
  • 2013-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-15
  • 1970-01-01
  • 2011-08-17
相关资源
最近更新 更多