【问题标题】:OpenCV in Python - resize without anti-aliasingPython中的OpenCV - 在没有抗锯齿的情况下调整大小
【发布时间】:2016-04-11 16:32:23
【问题描述】:

我有一个 512x160 像素的黑白图像,我想使用 OpenCV 将其放大(到 4096x1280)。负(白色)像素保持负值是非常重要的。 cv2.resize 默认情况下似乎对图像进行抗锯齿处理,从而产生误报像素。有没有办法禁用抗锯齿?

编辑:据我所知,这里是插值方法:

  • INTER_NEAREST - 最近邻插值
  • INTER_LINEAR - 双线性插值
  • INTER_CUBIC - 双三次插值
  • INTER_AREA - 使用像素区域关系重新采样。它可能是一个 图像抽取的首选方法,因为它不会产生莫尔条纹 结果。但是当图片被缩放时,它类似于INTER_NEAREST方法。
  • INTER_LANCZOS4 - 8x8 邻域的 Lanczos 插值。
  • INTER_MAX - 插值代码的掩码。
  • WARP_FILL_OUTLIERS - 标志,填充所有目标图像像素。 如果其中一些对应于源图像中的异常值,则它们是 设置为零。
  • WARP_INVERSE_MAP - 标志,逆变换。

【问题讨论】:

  • 在 c++ 中你可以选择插值类型,python 可能相同。您可能想要使用 CV_INTER_NEAREST 模式
  • @Micka 谢谢,“最近邻插值”到底是什么意思?
  • 调整大小后,不清楚新像素将获得哪种颜色。通常,您在该区域中的源图像像素之间进行插值。 INTER_NEAREST 改为选择源图像中最近像素的颜色。
  • 对于任何感兴趣的人,INTER_NEAREST 仍然给了我一些“误报”像素。我通过将图像大小调整为 np 数组解决了这个问题:np.repeat(np.repeat(image,8, axis=0), 8, axis=1)
  • 我发现scipy.misc.imresizecv2.resize 的更好替代品,用于在 Python 中使用 OpenCV 时放大图像。根据this answerscipy.ndimage.zoom也是一种选择。

标签: python opencv


【解决方案1】:

插值决定了如何进行抗锯齿处理,它正好相反,因为在这种情况下,图像没有足够的分辨率来显示其原始分辨率。 在 python 中,解决方案是使用cv2.INTER_NEAREST

scale_ratio = 0.5
img_resized = cv2.resize(img, None, fx=scale_ratio, fy=scale_ratio, interpolation=cv2.INTER_NEAREST)

【讨论】:

    猜你喜欢
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 2011-11-29
    • 1970-01-01
    • 2013-10-12
    • 2020-10-21
    • 1970-01-01
    • 2012-01-25
    相关资源
    最近更新 更多