2015-03-27 4 views
0

У меня есть этот код, который сжимает изображение lena.tif до черно-белого, используя четвертый бит большого значения. Моя проблема возникает, когда, когда я сохраняю изображение, конечный результат все черный, и я не знаю почему.Lenna compression save all black python

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") 

ответ

0

y является булевским массивом. Поэтому, когда вы преобразовать его в uint8 ваши ценности все либо 0, либо 1.

Но когда вы создать Image от y, вы режим '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") 

Выход:

enter image description here

0

Конечное изображение не все черное. Он очень темный, потому что все пиксели равны 0 (черный) или 1 (почти черный). В конце концов, y либо 0, либо 1 (False или True). imshow масштабирует диапазон так, чтобы вы видели что-то не так черное, как оно есть на самом деле. Вы уверены, что это y, которые нужно преобразовать в изображение?

Кстати, z не является необходимым. Запишите линию в петлю как x = x - y * (2**(7-i))