Python 为什么我的最终图像在像素后变成红色?

Python 为什么我的最终图像在像素后变成红色?,python,image,python-imaging-library,Python,Image,Python Imaging Library,我将通过排序来消除图像的“噪声”,主要是椒盐噪声,然后将平均值分配给坐标。结果应该基于之前的颜色,但是我得到的颜色变成了红色 这个参数有错误吗?非常感谢 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 rang

我将通过排序来消除图像的“噪声”,主要是椒盐噪声,然后将平均值分配给坐标。结果应该基于之前的颜色,但是我得到的颜色变成了红色

这个参数有错误吗?非常感谢

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()

您所做的不是
mean
过滤器(其中每个像素被其相邻像素的平均值替换),而是
median
过滤器(其中每个像素的相邻像素被排序,中心值或中值被用作新像素)

首先,使用PIL/枕头的内置功能更容易实现。我猜你是白手起家写这篇文章来学习一些图像处理。让我们假设一下

由于您没有提供示例图像,因此很难确定哪里出了问题。然而,我想问题在于:

  • 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")
图像变为红色的原因是,每个像素只写入一个字节,而不是所需的RGB的3个字节,因此只写入第一个通道(红色)