Почему мое окончательное изображение стало красным после putpixel? - PullRequest
0 голосов
/ 23 сентября 2018

Я собираюсь устранить «шум» изображений, в основном это шум соли-н-перца с помощью сортировки, а затем назначить среднее значение для координаты.Результат должен быть основан на предыдущем цвете, но то, что я получил, стало КРАСНЫМ.

Есть ли какой-либо параметр, неправильный с этим?Большое спасибо!

from PIL import Image

path='MonaLisa.png'
img=Image.open(path)
members=[(0,0)]*9 
size=width,height=img.size;
newimg=Image.new("RGB",(width,height),"white")


for i in range(1,width-1):
    for j in range(1,height-1):
        members[0] = img.getpixel((i-1,j-1))
        members[1] = img.getpixel((i-1,j))
        members[2] = img.getpixel((i-1,j+1))
        members[3] = img.getpixel((i,j-1))
        members[4] = img.getpixel((i,j))
        members[5] = img.getpixel((i,j+1))
        members[6] = img.getpixel((i+1,j-1))
        members[7] = img.getpixel((i+enter image description here1,j))
        members[8] = img.getpixel((i+1,j+1))
        members.sort()
        newimg.putpixel((i,j),(members[4]))
newimg.show()

1 Ответ

0 голосов
/ 26 сентября 2018

То, что вы делаете, это не фильтр 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, которые вам нужны, и поэтому записывается только первый канал (красный).

...