0

我在python中做了一个程序来在图像上应用高斯噪声,如下所示。输入图像是:

在此处输入图像描述

from PIL import Image
from math import *

import numpy

list1 = []
list2 = []

im = Image.open("313.JPG")
im.show()
list1 = list(im.getdata())

length = len(list1)
total = 0
for i in list1:
    total = total + i
mean = total /length  #mean
sd = numpy.std(list1) #standard deviation
print "mean is %d" %(mean)
print "sd is %d" %(sd)
for i in list1:
    g = (1/(sd * sqrt(2*pi)))*(exp(-((i - mean)**2)/(2*(sd**2)))) #gaussian 
    list2.append(g)
im.putdata(list2)
im.save('q4.jpg')             
im.show()

但我得到的是一个完整的暗图像,而不是图像上的噪点。请帮助。我期待下面的图像作为输出。 在此处输入图像描述

4

2 回答 2

1

由于高斯是归一化的,并且它的峰值在 中,1/sqrt(2pi)因此您应该乘以g255*sqrt(2*math.pi)

由于 youtg不是正态高斯,但它也被 归一化1/sd,要让g从 m0255youg的跨度应按N如下方式进行:

N = 255.*sqrt(2.*pi)*sd
g = N*(1/(sd * sqrt(2*pi)))*(exp(-((i - mean)**2)/(2*(sd**2))))

这就是我将您的图像作为输入得到的结果:

在此处输入图像描述

这是正确的:您的算法只计算每个像素的高斯值(高斯以平均值为中心):这意味着具有接近平均值的值的像素将变得更亮,远离平均值的像素变得更暗。没有办法从中得到噪音。你应该重新考虑你的算法。

于 2014-03-30T11:33:05.647 回答
0
from PIL import Image
from math import *
import numpy

list1 = []
im = Image.open("313.JPG")
im.show()
list1 = list(im.getdata())
length = len(list1)

# generate random noise data with mean 0 and sd 10
list2 = numpy.random.normal(0, 10, length)
# Add this to the image data
list3 = list1+list2

im.putdata(list3)
im.show()

添加噪声的结果

于 2014-03-30T14:24:58.047 回答