来自阵列和图像的图像使用点

时间:2013-11-01 14:32:43

标签: python image numpy python-imaging-library

我使用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)。

初始图片 initial image

带点的图像 using point

带阵列的图像 using arrays

他们怎么会这么不同?

2 个答案:

答案 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]

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