Оттенки серого .png в массив NumPy - PullRequest
1 голос
/ 24 апреля 2019

Действительно, на этот вопрос отвечали много раз. Однако, поскольку я не могу добавлять комментарии к ответу из-за «слишком низкой» репутации, я хотел бы обсудить решение, представленное в наиболее полном ответе .

Не было бы решение:

from PIL import Image
import numpy as np
import matplotlib.pyplot as plt #Used in the comparison below

im = Image.open('file.png').convert('RGB') #Opens a picture in grayscale
pic = np.array(im)
im.close()

работает нормально? Мне интересно, происходят ли неприемлемые изменения качества. Я заметил некоторые различия (то есть черные строки вверху в plt.imshow ()) при отображении изображения:

im.show() #Before closing
plt.imshow(pic)

но я не знаю, являются ли они только неизбежными последствиями преобразования в np.array.

PS - Если это важно, я бы упомянул, что я готовлю изображение к квантованию цвета (KMeans) и размыванию Флойда.

PPS - Если бы вы посоветовали мне не публиковать повторяющийся вопрос, а обсудить ответы напрямую - это было бы очень признательно.

1 Ответ

1 голос
/ 24 апреля 2019

Попробуй и посмотри!

from PIL import Image 
import numpy as np

# Other answer method
im1 = Image.open('gray.png').convert('L')
im1 = np.stack((im1,)*3, axis=-1)

# Your method
im2 = Image.open('gray.png').convert('RGB')                  
im2 = np.array(im2) 

# Test if identical
print(np.array_equal(im1,im2))

Пример вывода

True

Я бы сказал, что один аспект, который отличается, заключается в том, что метод в другом ответе будет работать (поскольку он фактически создает изображение в оттенках серого, где R = G = B), даже если входное изображение является цветным, тогда как ваш метод создаст цветное изображение.

...