То, что вы делаете, это не фильтр mean
(где каждый пиксель заменяется средним значением его соседей), а фильтр median
(где соседи каждого пикселя сортируются, а центральное или среднее значение равноиспользуется в качестве нового пикселя).
Во-первых, это гораздо проще сделать с помощью встроенного в PIL / Pillow PIL.ImageFilter.MedianFilter .Я думаю, вы пишете это с нуля, чтобы научиться обрабатывать изображения.Итак, давайте предположим, что.
Поскольку вы не предоставили образец изображения, трудно сказать наверняка, что не так.Тем не менее, я бы предположил, что проблема в следующем:
MonaLisa.png
- это цветное изображение, и вы обрабатываете только один канал значений оттенков серого, потому что вы зацикливаетесь только на высоте и ширине изображения,но не более 3 каналов RGB, или
MonaLisa.png
- это изображение в оттенках серого, но оно имеет палитру, и числа, на которые вы смотрите, являются индексами в цветовой палитре, а не фактическими значениями RGB.
Итак, давайте предположим, что вы намереваетесь обрабатывать в оттенках серого, вам нужно убедиться, что ваше входное изображение имеет оттенки серого (а не цвета) и значения оттенков серого (а не индексы палитры), поэтомунеобходимо использовать:
# Open image as greyscale, not palettised, not colour
img=Image.open(path).convert('L')
Во-вторых, ваше выходное изображение также должно быть в оттенках серого, поэтому:
newimg=Image.new("L",(width,height),"white")
Причина, по которой ваше изображение стало красным, заключалась в том, что вы записывали только один байт для каждого пикселяа не 3 байта RGB, которые вам нужны, и поэтому записывается только первый канал (красный).