从图像Python PIL中删除噪声

时间:2016-09-11 08:25:32

标签: python python-imaging-library

新手在这里。 有一个图像 我在图像上添加了噪点,我需要用噪声(或类似的东西)清除图像。 接下来是不合理的algorythm:

  

如果像素的亮度大于平均亮度   当地邻域,那么像素的亮度是   取而代之的是周围环境的平均亮度。

from PIL import Image
import random
from multiprocessing import Pool
from multiprocessing.dummy import Pool as ThreadPool

img=Image.open('pic.bmp')
print(img.size)
randomenter=int(input('Enter numpix: '))
for numpix in range(0, randomenter):
    x=random.randint(0,int(img.size[0]-1))
    y=random.randint(0,int(img.size[1]-1))
    r=random.randint(0,255)
    g=random.randint(0,255)
    b=random.randint(0,255)
    img.putpixel((x,y),(r,g,b))
img.show()
img.save("noise.bmp", "BMP")

img2=Image.open("noise.bmp")
w, h = img2.size

pix=img2.copy()
for x in range(0,w-1):
    if x-1>0 and x<w:
        for y in range(0,h-1):
            if y-1>0 and y<h:
                local1=(0.3 * pix.getpixel((x-1,y-1))[0]) + (0.59 * pix.getpixel((x-1,y-1))[1]) + (0.11 * pix.getpixel((x-1,y-1))[2])
                local2=(0.3 * pix.getpixel((x-1,y))[0]) + (0.59 * pix.getpixel((x-1,y))[1]) + (0.11 * pix.getpixel((x-1,y))[2])
                local3=(0.3 * pix.getpixel((x-1,y+1))[0]) + (0.59 * pix.getpixel((x-1,y+1))[1]) + (0.11 * pix.getpixel((x-1,y+1))[2])
                local4=(0.3 * pix.getpixel((x,y-1))[0]) + (0.59 * pix.getpixel((x,y-1))[1]) + (0.11 * pix.getpixel((x,y-1))[2])
                LOCAL5=(0.3 * pix.getpixel((x,y))[0]) + (0.59 * pix.getpixel((x,y))[1]) + (0.11 * pix.getpixel((x,y))[2])
                local6=(0.3 * pix.getpixel((x,y+1))[0]) + (0.59 * pix.getpixel((x,y+1))[1]) + (0.11 * pix.getpixel((x,y+1))[2])
                local7=(0.3 * pix.getpixel((x+1,y-1))[0]) + (0.59 * pix.getpixel((x+1,y-1))[1]) + (0.11 * pix.getpixel((x+1,y-1))[2])
                local8=(0.3 * pix.getpixel((x+1,y))[0]) + (0.59 * pix.getpixel((x+1,y))[1]) + (0.11 * pix.getpixel((x+1,y))[2])
                local9=(0.3 * pix.getpixel((x+1,y+1))[0]) + (0.59 * pix.getpixel((x+1,y+1))[1]) + (0.11 * pix.getpixel((x+1,y+1))[2])
                localall=(local1+local2+local3+local4+local6+local7+local8+local9)/8
                if LOCAL5<localall:
                    img2.putpixel((x,y),(int(pix.getpixel((x,y))[0]*localall/LOCAL5),int(pix.getpixel((x,y))[1]*localall/LOCAL5),int(pix.getpixel((x,y))[2]*localall/LOCAL5)))
img2.show()

亮度变化时出现问题。 官方码头没有关于此案例的详细信息。 有没有解决方案?

1 个答案:

答案 0 :(得分:1)

首先,您需要创建图像副本以将数据写入:imgCopy = img.copy()。 否则,您的噪声校正像素将影响尚未触摸的像素的校正。 在你的else语句中,你只需要对中间像素进行标准化,然后将其乘以你计算的平均亮度:

imgCopy[i, j] = imgCopy[i, j] * local / nuzh