【问题标题】:Prevent overflow when multiply numpy image array乘以numpy图像数组时防止溢出
【发布时间】:2021-01-29 14:48:15
【问题描述】:

我正在处理 numpy 中的图像,有时我会缩放图像。

import scipy.misc        as msc
import numpy             as np
...
img_rgb = msc.imread(img_fn)
im_scaled = img_rgb * factor

结果有时看起来很难看,明亮区域显示黑点。这似乎是由 8 位图像 RGB 像素的数值溢出引起的。 有没有办法应用一个上限运算符,如果乘法 > 255,它会被剪裁为 255。(我对下限函数不感兴趣,因为我不希望信号变为负数)

我知道我可以测试循环中的每个像素,但不会遵循数组处理的 numpy 哲学。

非常感谢任何帮助。

谢谢, 格特

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    您可以使用numpy.clip(),它正是这样做的。

    但是,图像可能也不会很漂亮。通常,您想要的是将图像值从 [0,255] 范围内的字节转换为 [0,1] 范围内的浮点值(即使是隐式),然后应用 gamma correction

    【讨论】:

    • clip() 对整数溢出没有帮助。相乘后剪裁为时已晚,因为溢出已经发生了。您必须将输入向上转换为 16 位整数或浮点数,进行乘法运算,然后 然后 剪辑。
    • @WarrenWeckesser clip 在乘法之前,即scaled = img.clip(0, 255 // factor) * factor
    • 您的评论是对的。这就是为什么第二段中隐含的最终建议是从字节转换为浮点,执行操作,然后再转换回来。
    【解决方案2】:

    使用np.clip(x*float(factor), 0, 255).astype(np.uint8)

    例如

    x = np.array([120, 140], dtype=np.uint8)
    factor = 2
    result = np.clip(x*float(factor), 0, 255).astype(np.uint8)
    > array([240, 255], dtype=uint8)
    

    注意float(factor) 很重要,因为如果将其保留为 int,则会在剪辑之前溢出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-06
      • 2012-09-12
      • 2018-06-14
      • 2019-06-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多