Python 防止乘法numpy图像数组时溢出

Python 防止乘法numpy图像数组时溢出,python,numpy,Python,Numpy,我在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中处理图像,并在某个点缩放图像

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原理

非常感谢您的帮助

谢谢, Gert

你可以使用,它确实做到了这一点

然而,图像可能也不会很美。通常,您需要将图像值从[0255]范围内的字节转换为[0,1]范围内的浮点(即使是隐式),然后应用。

使用
np.clip(x*float(factor),0255)。astype(np.uint8)

e、 g


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

clip()
对整数溢出没有帮助。因为溢出已经发生,所以在相乘后进行剪裁为时已晚。您必须将输入向上转换为(比如)16位整数或浮点,进行乘法运算,然后在乘法之前进行剪辑。@WarrenWeckesser
clip
,即
scaled=img.clip(0,255//factor)*factor
。您的评论是对的。这就是为什么在第二段中,隐式的最后建议是从字节转换为浮点,执行操作,然后再转换回。
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)