我使用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)。
初始图片
带点的图像
带阵列的图像
他们怎么会这么不同?
答案 0 :(得分: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
不同,您仍然可以执行此操作,因为broadcasting:
percentages = np.array([25., 50., 75.])
values = np.floor(255*percentages/100)
arr += values # the first will be added to the first channel, etc.
答案 1 :(得分:1)
Fixxed it:)
没有考虑越界。所以我做了
for i in range(3):
conditions = [arr[...,i] > 255, arr[...,i] < 0]
choices = [255, 0]
arr[...,i] = np.select(conditions, choices, default=arr[...,i]
像魅力一样......:)