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

You have values greater than 255 in your array, which you then convert to uint8 ... what do you want those values to become in the image? If you want them to be 255, clip them first:

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

By the way, there's no need to add to each color band separately:

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

If your value is different for each band, you can still do this because of 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.
于 2013-11-01T14:58:03.270 に答える