Изображение темнеет
Я сделал программу на 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()
Но я получаю полное темное изображение вместо шума на изображении. Пожалуйста, помогите. Я ожидаю, что изображение будет показано ниже.
2 ответа
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()
Так как гауссов нормализован, и его пик находится в 1/sqrt(2pi)
, вы должны умножить g
за 255*sqrt(2*math.pi)
,
Так как ты g
не является нормальным гауссовским, но также нормализуется 1/sd
, позволить g
пролет от м0
в 255
ты должен лихорадочно g
от N
следующее:
N = 255.*sqrt(2.*pi)*sd
g = N*(1/(sd * sqrt(2*pi)))*(exp(-((i - mean)**2)/(2*(sd**2))))
Вот что я получаю с вашим изображением на входе:
Это правильно: ваш алгоритм просто вычисляет для каждого пикселя его гауссовское значение (где гауссиан центрируется в среднем значении): это означает, что пиксель со значением около среднего значения станет более ярким, а пиксель, удаленный от среднего, станет темнее. Нет способа получить шум от этого. Вы должны заново продумать свой алгоритм.