学习OpenCV+Python第二天,老师布置作业让给图片添加噪声,我是一脸懵,通过查资料和看书,写下如下代码:
import cv2
import numpy as np
import random
import tkinter
import math
def rgb2gray(rgb):
gray = np.zeros((rgb.shape[0],rgb.shape[1],1),np.uint8) # 创建图像变量,防止gray的改变导致如果把原图的改变
for i in range(rgb.shape[0]):
for j in range(rgb.shape[1]):
gray[i,j] = 0.299 * rgb[i, j, 0] + 0.587 * rgb[i, j, 1] + 0.114 * rgb[i, j, 2]
return gray
def Gauss_random(mu,sigem): # X是随机变量,mu是均值,sigema是方差
x = random.uniform(mu,sigem*sigem)
t1 = (x-mu)*(x-mu)
t2 = 2*sigem*sigem
t3 = math.exp(-(t1/t2))
t4 = sigem*math.sqrt(2*math.pi)
f = 1/t4 * t3
return f
def Gauss(gray,m,s,k): #高斯噪声就是噪声是按照高斯分布,分布在图像上的,是黑色的
gauss_p = gray*1
for i in range(gauss_p.shape[0]):
for j in range(gauss_p.shape[1]):
temp = gauss_p[i,j] + Gauss_random(m,s)*k
if temp < 0:
temp = 0
elif temp > 255:
temp = 255
gauss_p[i,j] = temp
return gauss_p
def Salt(gray):
salt_p = gray*1
for i in range(6000):
addx = random.randint(0, salt_p.shape[0] - 1) #产生随机整数 用于确定X和Y的位置,即像素的位置
addy = random.randint(0, salt_p.shape[1] - 1)
if random.randint(0,1) == 0 :
salt_p[addx,addy] = 0
else:
salt_p[addx,addy] = 255
return salt_p
def Img(m,s,k):
m=int(m)
s=int(s)
k = int(k)
img = cv2.imread("d:/5.rgb")
gray = rgb2gray(img)
print(gray.shape[0],gray.shape[1])
salt = Salt(gray)
gauss = Gauss(gray,m,s,k)
cv2.imshow("gray",gray)
cv2.imshow("salt",salt)
cv2.imshow("gauss",gauss)
cv2.waitKey(0)
cv2.destroyAllWindows()
def input():
mu = enterS1.get()
sigem = enterS2.get()
k = enterS3.get()
Img(mu,sigem,k)
root = tkinter.Tk()
s1 = tkinter.StringVar(value='')
s2 = tkinter.StringVar(value='')
s3 = tkinter.StringVar(value='')
labelS1 = tkinter.Label(root,text = 'μ:',justify = tkinter.RIGHT,width = 80)
labelS1.place(x = 10,y = 5,width = 80,height = 20)
enterS1 = tkinter.Entry(root,width = 80,textvariable = s1)
enterS1.place(x = 100,y = 5,width = 80,height = 20)
labelS2 = tkinter.Label(root,text = 'σ:',justify = tkinter.RIGHT,width = 80)
labelS2.place(x = 10,y = 30,width = 80,height = 20)
enterS2 = tkinter.Entry(root,width = 80,textvariable = s2)
enterS2.place(x = 100,y =30 ,width = 80,height = 20)
labelS3 = tkinter.Label(root,text = 'k :',justify = tkinter.RIGHT,width = 80)
labelS3.place(x = 10,y = 55,width = 80,height = 20)
enterS3 = tkinter.Entry(root,width = 80,textvariable = s3)
enterS3.place(x = 100,y = 55,width = 80,height = 20)
buttonOK = tkinter.Button(root,text = '确定',command = input)
buttonOK.place(x=90,y=90,width = 50,height = 30)
root.mainloop()
椒盐噪声比较简单,就不多说了。
高斯噪声是加性噪声,所以要将噪声和原图片加在一起。
在这里写了一个小界面,方便调节参数 μ和σ,k,以便观察图片的变化。使用搜狗输入法,输入v6再往下找找就能找到这些符号。
如果有什么问题可以发表评论询问。