python - 如何将负 (<0) RGB 颜色值放入 PIL 中的图像?

标签 python image compression python-imaging-library

我正在尝试为学校做一种增量编码任务,我需要将连续像素之间的差异放入下一个像素中,以便稍后对它们进行解码。不幸的是,如果差异为负,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")

最佳答案

对每个 RGB 值使用模 256。这意味着所有值都在 [0-255] 范围内结束,即一个字节,例如-1 映射到 255。

然后,对于两个 RR0R1,它们的区别是:

Rdiff = (R0 - R1) % 256

稍后,您可以执行相反的操作:

R0 = (R1 + Rdiff) % 256

只要所有输入也在 0-255 范围内(在本例中为 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

关于python - 如何将负 (<0) RGB 颜色值放入 PIL 中的图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54449562/

相关文章:

algorithm - 压缩成员(member)表

c++ - 如何将单个位写入bin文件

javascript - 如何使用 selenium python 从动态网站检索所有链接

python - Pyplot 在缩放时保持文本大小

python - 检查用于请求 Python/Scrapy + ProxyMesh 的 IP 地址

python - 如何划分轮廓?

c# - 如何在 C# 中提取 ZIP 文件

python - python中是否有任何采用距离矩阵的好的层次聚类包?

image - 在matlab中,如何将图形保存为图像,就像在图形窗口中使用 "Save As..."一样?

python - 如何使用Python遍历第4行中的第4个像素?