Python 防止乘法numpy图像数组时溢出
我在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。(我对楼层功能不感兴趣,因为我不希望信号变
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位整数或浮点,进行乘法运算,然后在乘法之前进行剪辑。@WarrenWeckesserclip
,即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)