【问题标题】:Shrink/resize an image without interpolation缩小/调整图像大小而不进行插值
【发布时间】:2017-01-24 04:11:41
【问题描述】:

我有一个大小为 1044*1408 的图像 F,它只有 3 个整数值 0、2 和 3。

我想把它缩小到 360*480。现在我使用Z= cv2.resize(F,(480,380))。但是Z 是插值的,它有很多唯一值,不仅仅是 0、2 和 3。我不能只将插值四舍五入到最接近的整数,因为我会得到一些 1。

F 从 tif 文件中读取并进行操作,现在它是一个 ndarray。所以我不能使用 PIL:F = F.resize((new_width, new_height)) 因为F 不是来自F = Image.open(*)

【问题讨论】:

  • 你想要的可能是重新采样图像而不是调整它的大小。既然你提到了ndarray,我假设你使用的是numpy。查看stackoverflow.com/questions/25876640/…中的解决方案(“numpy slicing”)它将允许重采样(子采样)而无需插值。
  • CV_INTER_NN“插值”方法不应该选择原始像素值之一(与调整大小的像素位置距离最小的那个)?
  • Yes set interpolation=cv2.INTER_NEAREST 将让您使用最接近的像素值。我可以使用Z= cv2.resize(F,(480,380),interpolation=cv2.INTER_NEAREST),只得到 0,2 和 3。我想知道是否有任何方法根本不进行插值

标签: python opencv


【解决方案1】:

你可以使用INTER_NEAREST

Z= cv2.resize(F,(480,380),fx=0, fy=0, interpolation = cv2.INTER_NEAREST)

【讨论】:

  • 有没有办法上采样和增加图片尺寸??
  • 我不是说超分辨率。如果 cv2 有,那就太好了,但是简单的插值
【解决方案2】:

或者,您也可以使用skimage.transform.resize。参数order = 0 强制执行最近邻插值。

   Z = skimage.transform.resize(F,
                               (480,380),
                               mode='edge',
                               anti_aliasing=False,
                               anti_aliasing_sigma=None,
                               preserve_range=True,
                               order=0)

【讨论】:

    猜你喜欢
    • 2013-04-08
    • 1970-01-01
    • 2023-01-26
    • 1970-01-01
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 2012-01-06
    • 2011-06-16
    相关资源
    最近更新 更多