Lenna压缩保存全黑python

Lenna compression save all black python

所以我有这段代码使用高位第四位将 lena.tif 图像压缩为黑白图像。我的问题出现在保存图片的时候,最后的结果全黑了,不知道为什么。

from PIL import Image
import numpy as np
import matplotlib.pyplot as plt

x_img = Image.open("lenac.tif")
x_gray = x_img.convert("L")
x = np.array(x_gray)
for i in range(0,4):
    y = x > (2**(7-i))-1
    z = x - y * (2**(7-i))
    x = z    

new_img = Image.fromarray(y.astype('uint8'),'L')
plt.imshow(new_img, cmap='gray')
new_img.save("lena_4 .bmp")

y 是一个布尔数组。因此,当您将其转换为 uint8 时,您的值都是 0 或 1。

但是当您从 y 创建 Image 时,您指定模式 'L',即 8 bits per pixel

因此您可以简单地将像素缩放到 8 位范围:

from PIL import Image
import numpy as np
import matplotlib.pyplot as plt

x_img = Image.open("lenac.tif")
x_gray = x_img.convert("L")
x = np.array(x_gray)
for i in range(0,4):
    y = x > (2**(7-i))-1
    z = x - y * (2**(7-i))
    x = z

y = y.astype('uint8') * 255        # This scales the pixel values

new_img = Image.fromarray(y ,'L')  # Use y here instead of y.astype(...)
plt.imshow(new_img, cmap='gray')
#plt.show()
new_img.save("lena_4.bmp")

输出:

最终图像并非全黑。它只是非常暗,因为所有像素都是 0(黑色)或 1(几乎是黑色)。毕竟,y 不是 0 就是 1(False 或 True)。 imshow 缩放范围,以便您看到的东西不像实际那样黑。确定是y需要转成图片吗?

顺便说一下,z 是不必要的。将循环中的行写为 x = x - y * (2**(7-i))