我在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()
但是我得到一个完整的黑暗图像,而不是在图像上得到噪音。请帮助。我期待下面的图像作为输出。
答案 0 :(得分:1)
由于高斯标准化,其峰值在1/sqrt(2pi)
,因此您应该g
乘以255*sqrt(2*math.pi)
。
由于g
不是普通的高斯,但它也是1/sd
的标准化,要让g
跨越0
到255
你shoud moltiply g
N
如下:
N = 255.*sqrt(2.*pi)*sd
g = N*(1/(sd * sqrt(2*pi)))*(exp(-((i - mean)**2)/(2*(sd**2))))
这是我的图像作为输入:
这是正确的:你的算法只计算每个像素,它的高斯值(高斯以平均值为中心):这意味着具有接近平均值的值的像素将变得更高并且像素距离平均值更远越来越黑了。无法从中获得噪音。你应该考虑你的算法。
答案 1 :(得分: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()