2

我正在使用 Image.point 和 Image.fromarray 对图像执行完全相同的操作,将所有像素的值一起增加相同的值。问题是我得到了完全不同的图像。

使用点

def getValue(val):
    return math.floor(255*float(val)/100)

def func(i):
    return int(i+getValue(50))

out = img.point(func)

使用数组和 numpy

arr = np.array(np.asarray(img).astype('float'))
value = math.floor(255*float(50)/100)
arr[...,0] += value
arr[...,1] += value
arr[...,2] += value

out = Image.fromarray(arr.astype('uint8'), 'RGB')

我正在使用相同的图像(jpg)。

初始图像 初始图像

带点的图像 使用点

带有数组的图像 使用数组

他们怎么会有这么大的不同?

4

2 回答 2

4

您的数组中有大于 255 的值,然后将其转换为 uint8 ...您希望这些值在图像中变成什么?如果您希望它们为 255,clip则首先:

out_arr_clip = Image.fromarray(arr.clip(0,255).astype('uint8'), 'RGB')

顺便说一句,无需单独添加到每个色带:

arr = np.asarray(img, dtype=float)   # also simplified
value = math.floor(255*float(50)/100)
arr += value                           # the same as doing this in three separate lines

如果您value对每个乐队都不同,您仍然可以因为广播而这样做:

percentages = np.array([25., 50., 75.])
values = np.floor(255*percentages/100)
arr += values   # the first will be added to the first channel, etc.
于 2013-11-01T14:58:03.270 回答
1

修复它:)

没有考虑越界。所以我做了

for i in range(3):
    conditions = [arr[...,i] > 255, arr[...,i] < 0]
    choices = [255, 0]
    arr[...,i] = np.select(conditions, choices, default=arr[...,i]

像魅力一样工作.... :)

于 2013-11-01T14:59:35.147 回答