Пожалуйста, дайте мне знать, почему image.fromarray в PIL не работает как plt.imshow в matplotlib - PullRequest
0 голосов
/ 21 февраля 2019

Я пытался отобразить изображение с помощью image.fromarray из массива, но я не смог получить правильное изображение, как я получаю из plt.imshow.Есть ли у вас какие-либо идеи по этому поводу?

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

row,col,ch=img_array.shape
mean=0.0
sigma=20
gauss = np.array(np.random.normal(mean,sigma,(row,col,ch)),dtype=np.int64)
noisy = img_array + gauss
new_image = Image.fromarray(noisy,'RGB')
new_image

not requested image

Если я запустлю его по plt.imshow, запрошенное изображение будет ниже

 plt.imshow(noisy, interpolation='nearest')
 plt.show()

requested image

1 Ответ

0 голосов
/ 21 февраля 2019

Ваши типы слишком велики - int64.

Измените строки с:

gauss = ...

на:

gauss = np.array(np.random.normal(mean,sigma,(row,col,ch)),dtype=np.int8)                  
noisy = (img_array + gauss).astype(np.uint8)                                               
Image.fromarray(noisy,'RGB').save('result.png') 

enter image description here

В идеале вы бы тоже нормализовались, потому что вы добавляете пиксель в диапазоне 0..255 к некоторому шуму в диапазоне -20 .. + 20, что означает, что вы будете переполнены 255 в некоторых точках.

...