numpy 如何在添加值时截断uint8数组而不是溢出?[duplicate]

5f0d552i  于 2022-11-24  发布在  其他
关注(0)|答案(1)|浏览(142)

此问题在此处已有答案

Avoid overflow when adding numpy arrays(7个答案)
10天前关闭。
我想实现一个工具来调整RGB图像的亮度,它只是一个dtype uint8(N,M,3) 形状的numpy数组。
这个算法非常简单,我只是把[-255, 255]范围内的一个整数加到我的图像的所有像素上。
不幸的是,我还需要截断得到的像素值以保持在范围[0,255]内,并且numpy在我添加该值时使数组溢出。
有没有一种方法可以增加亮度,并在不创建中间数组或使用丑陋循环的情况下截断结果?
我正在处理大图像,所以我需要提高效率。

5ssjco0h

5ssjco0h1#

有点晚了,但我使用了一个方便的非线性函数(arctan),而不是剪切溢出值:

from PIL import Image
import numpy as np

factor = 3
c = 512 / np.pi  # a constant to be used along with arctan

adjusted_image = np.arctan(data/c * factor) * c
Image.fromarray(adjusted_image.astype(np.int8), 'RGB')

实际上,可以对非线性函数进行微调;以此为例进行测试。

相关问题