Python + Numpy после преобразования массива в изображение получается чёрное изображение
Есть программа на Python, которая получает изображения, переводит в серые тона, получет массив значений пикселей с помощью NumPy, после чего делаем преобразования значений массива с помощью фильтра filtr, после чего сохраняем изображение. Само изображение простое - белый фон с черным смайликом 100 х 100. Проверяю значения нововй полученной матрицы(массива) со значениями всё впорядке, но при сохранения в png получается просто черный квадрат. Почему так происходит, проблема в самом алгоритме(он тестовый) или всё же я конвертирую массив и сохраняю не правильно? Код на Python:
from PIL import Image
import numpy
filtr = numpy.array([[1, 2, 1], [2, -4, 2], [1, 2, 1]]) #маска фильтра
im = Image.open('s.png') #открываем изображение
print(im.size)
im_matr = numpy.asarray(im.convert('L')) #преобразовываем в чб и выводим в массив
im_rows, im_cols = im_matr.shape #получаем размер изображения
print(im_matr) #выводим значения массива
new_im_matr = numpy.zeros(shape = (im_rows, im_cols)) #cоздаём новый массив
new_im_matr = numpy.int16(new_im_matr) #переводим значения в целое
k = 0
for main_item in im_matr: #тестовый алгоритм для преобразования
l = 0 #массива изображения с помощью маски filtr
for pod_item in main_item:
for item1 in filtr:
for item2 in item1:
new_im_matr[k][l] += int(item2) * int(pod_item)/8
l = l+ 1
k = k + 1
print(new_im_matr) #выводим значения нового массива
im2 = Image.fromarray(new_im_matr) #массив в изображение
im2.save('s2.png') #сохраняем новое изображение
Ответы (1 шт):
Вероятно, специфика преобразования массива fromarray дает неверную интерпретацию без явного указания типа данных uint. поэтому просто попробуйте сделать так:
im2 = Image.fromarray(new_im_matr*255)
перед сохранением вместо im2 = Image.fromarray(new_im_matr)
UPDATE
после уточнений автора вопроса я бы рекомендовал сделать так:
new_im_matr = numpy.zeros(shape = (im_rows, im_cols), dtype="uint8")
вместо просто
new_im_matr = numpy.zeros(shape = (im_rows, im_cols))
И при сохранении, как было сказано раньше:
im2 = Image.fromarray(new_im_matr*255)
Насчет преобразования - я не стал разбираться с тем, что делает тройной цикл, потому что больше двух вложенных циклов - это уже плохой код, особенно, если вы пользуетесь numpy, но есть подозрение, что вам просто нужно инвертировать изображение. То есть, сделать
im2 = Image.fromarray(255 - new_im_matr*255)