Как поместить отрицательные (<0) значения цвета RGB на изображение в PIL? - PullRequest
0 голосов
/ 31 января 2019

Я пытаюсь сделать что-то вроде задачи дельта-кодирования для школы, и мне нужно поместить разницу между последовательными пикселями в следующие пиксели, чтобы потом их декодировать.К сожалению, если разница отрицательная, функция PIL putdata каким-то образом преобразует значение в 0, что делает невозможным его последующее декодирование с использованием обратного фильтра.Что я мог сделать, чтобы сделать это возможным?Обратите внимание, что закодированное изображение не должно выглядеть красиво, оно просто должно содержать данные, необходимые для его декодирования.

from PIL import Image

img = Image.open("lena.bmp")
img = img.convert("RGB")
encoded_img = Image.new("RGB", (img.size[0], img.size[1]))
decoded_img = Image.new("RGB", (img.size[0], img.size[1]))
colorlist = []
pixels = []

# Encoding
img.show()

for pixel in img.getdata():

    R0 = pixel[0]
    G0 = pixel[1]
    B0 = pixel[2]
    colorlist.append(R0)
    colorlist.append(G0)
    colorlist.append(B0)

    if len(colorlist) > 3:
        R0 -= colorlist[len(colorlist) - 6]
        G0 -= colorlist[len(colorlist) - 5]
        B0 -= colorlist[len(colorlist) - 4]

    pixels.append((R0, G0, B0))

encoded_img.putdata(pixels)
encoded_img.show()
encoded_img.save("encoded.bmp")

1 Ответ

0 голосов
/ 31 января 2019

Используйте модуль 256 для каждого из значений R, G, B.Это означает, что все значения оказываются в диапазоне [0-255], то есть один байт, например, -1 соответствует 255.

Затем для двух R значений R0 и R1, их разница будет:

Rdiff = (R0 - R1) % 256

Позже вы можете сделать обратное:

R0 = (R1 + Rdiff) % 256

Расчет будет правильным, если все входы также находятся в диапазоне 0-255 (в данном случае это они).

Это некоторые примеры кодированных (Rdiff) значений с такой логикой:

R0=50, R1=20  --> Rdiff=30
R0=10, R1=50  --> Rdiff=216
R0=0,  R1=5   --> Rdiff=251
R0=33, R1=200 --> Rdiff=89
...