我要通过排序来消除图像的“噪点”,主要是椒盐噪声,然后将平均值分配给坐标。结果应该基于以前的颜色,但是我变成红色了。
这个参数有问题吗?非常感谢!
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()
答案 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字节,因此只有第一个通道(红色)被写入。