椒盐噪声及高斯噪声图片加噪python实现(附代码)
写在前面
这个博客会记录我最近学习的笔记,算是成长记录啦,如果有错误的地方还请指出,这也是学习的过程呀!
椒盐噪声
椒盐噪声又称为脉冲噪声,它是一种随机出现的白点或者黑点。 椒盐噪声 = 椒噪声 + 盐噪声 ,椒盐噪声的值为0(黑色)或者255(白色),这里假设为等概率的出现0或者255。如果一张图像的宽x高 = 10x10 ,那么它的像素共计100个。
1、shape函数
关于shape:
from numpy import *
a=array([[1,2,3],[2,3,4],[3,4,5],[4,5,6]]) a.shape[0]
得到a的行数为 4
然后输入a.shape[1]
得到a的列数为 3
也就是说,shape[0]用于得到数组的行,shape[1]用于得到数组的列,在图像中前者代表宽,后者代表列,相乘就能得到像素。
2、椒盐噪声加噪
原图:
加噪后:
import numpy as npimport cv2 #pip install opencv_python
from numpy import shapeimport random
def fun1(src,percetage):
NoiseImg=src
NoiseNum=int(percetage*src.shape[0]*src.shape[1])
for i in range(NoiseNum): #返还一个迭代器
#把一张图片的像素用行和列表示的话,randX 代表随机生成的行,randY代表随机生成的列
#random.randint生成随机整数
#椒盐噪声图片边缘不处理,故-1
randX=random.randint(0,src.shape[0]-1)
randY=random.randint(0,src.shape[1]-1)
#random.random生成随机浮点数,随意取到一个像素点有一半的可能是白点255,一半的可能是黑点0
if random.random()<=0.5:
NoiseImg[randX,randY]=0
else:
NoiseImg[randX,randY]=255
return NoiseImg
#导入图片
img=cv2.imread('123.jpg',0)
#调fun1函数,0.2为参数
img1=fun1(img,0.2)
#在文件夹中写入命名为PepperandSalt.jpg的加噪后的图片
cv2.imwrite('PepperandSalt.jpg',img1)
#展示加噪后的图片
cv2.imshow('PepperandSalt',img1)
cv2.waitKey(0)
高斯噪声
高斯白噪声:通过使用函数random.gauss(means,sigma)生成均值为means,标准差为sigma的高斯白噪声。
#随机生成符合正态(高斯)分布的随机数,means,sigma为两个参数
import numpy as npimport cv2
from numpy import shapeimport random
def GaussianNoise(src,means,sigma,percetage):
NoiseImg=src
NoiseNum=int(percetage*src.shape[0]*src.shape[1])
for i in range(NoiseNum):
randX=random.randint(0,src.shape[0]-1)
randY=random.randint(0,src.shape[1]-1)
#此处在原有像素灰度值上加上随机数
NoiseImg[randX,randY]=NoiseImg[randX,randY]+random.gauss(means,sigma)
#若灰度值小于0则强制为0,若灰度值大于255则强制为255
if NoiseImg[randX, randY]< 0:
NoiseImg[randX, randY]=0
elif NoiseImg[randX, randY]>255:
NoiseImg[randX, randY]=255
return NoiseImg
img=cv2.imread('1234.png',0)
img1=GaussianNoise(img,2,4,0.5)
cv2.imwrite('GaussianNoise.jpg',img1)
cv2.imshow('GaussianNoise',img1)
cv2.waitKey(0)
结束语
下一篇预告:图片去噪