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 шт):

Автор решения: strawdog

Вероятно, специфика преобразования массива 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)
→ Ссылка