2016-05-27 8 views
1

Использование PIL и Tkinter, я пытаюсь сделать некоторые манипуляции в pixelMatrix образа как:Преобразование изображения в другие

start = Image.open("gua.jpg") 
sta = start.load() 
i,j = start.size 
current = np.zeros((i,j,3)) 

for ix in range(i): 
    for jx in range(j): 
     current[ix,jx] = [elem*0.5 for elem in sta[ix,jx]] 

current = np.asarray(current) 
current = Image.fromarray(current, "RGB") 
out = ImageTk.PhotoImage(current) 

panel.configure(image = out) 
panel.image = out 

Но даже если я просто передать информацию от pixelMatrix на изображение для моей матрицы (current[ix,jx] = sta[ix,jx]), мой результат случайный, что я делаю неправильно?

Спасибо!

enter image description here

P.S: Я могу сделать out = ImageTk.PhotoImage(start) без проблем.

+0

После вас do 'current = np.asarray (current)' что на самом деле выглядит 'current'? (распечатайте и опубликуйте первый бит, я знаю, что он будет действительно большой) –

+0

, когда внутри цикла, я делаю 'print sta [ix, jx], current [ix, jx]', это вывод: '(128, 128, 120) [128. 128. 120.]' после того, как оно было получено в массив: '... [[179. 179. 177.] [174. 174. 172 .] [167. 167. 165.] ... [73. 68. 64.] [84. 70. 67.] [153. 133. 132.]] ... ' –

+0

что вы ожидаете? Я имею в виду, что вы хотите сделать? –

ответ

1

Вы должны указать, что dtype вашего массива np.uint8:

current = np.zeros((i,j,3),dtype=np.uint8) 

Если не указать это при PIL использует метод .tobytes() на массиве он получает данные, которые не имеет смысла для "RGB", потому что он предназначен для чисел с плавающей запятой.

отметить также, что fromarray принимает строку данных по строкам, так что высота должна быть первым размером массива, вы можете исправить это, просто принимая transpose перед передачей его fromarray:

img = Image.fromarray(current.transpose(1,0,2))