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

时间:2018-09-23 03:04:52

标签: 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 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 :(得分:1)

您正在执行的操作不是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字节,因此只有第一个通道(红色)被写入。