记录自己用python加opencv实现的图像处理的入门操作,各种平滑去噪滤波器的实现。
包括有:产生的椒盐噪声、高斯噪声等等,以及使用的中值滤波、平均滤波、高斯滤波等等。
分成了两部分来实现:一是自编写函数来实现,二是调用opencv中的相应函数,对比效果。
噪声的产生:分别是椒盐噪声和高斯噪声,原理的话可以参考别人的博客或我之后再补充,噪声就是在原来的图像上以一定的特殊规律给图像增添一些像素,使图像变得模糊等等。
1.噪声的自编写
椒盐噪声:
输入图像和自定义的噪声阈值,输出处理后的图像
# 向图片中添加椒盐噪声
def salt_pepper_noise(image, prob): # prob:盐噪声阈值,由用户自己决定
output = np.zeros(image.shape, np.uint8)
thres = 1 - prob # 胡椒噪声阈值
for i in range(image.shape[0]): # 遍历整个图片的灰度级
for j in range(image.shape[1]):
randomnum = random.random() # 生成一个随机0-1之间的随机数
if randomnum < prob: # 如果随机数大于盐噪声阈值0.1,则将此位置灰度级的值设为0,即添加盐噪声
output[i][j] = 0
elif randomnum > thres: # 如果随机数大于胡椒噪声阈值1-0.1,则将此位置灰度级的输出设为255,即添加胡椒噪声
output[i][j] = 255
else: # 如果随机数处于两者之间,则此位置的灰度级的值等于原图的灰度级值
output[i][j] = image[i][j]
return output
高斯噪声:
输入图像,自定义的参数:均值、方差,输出的是处理后的图像
# 向图片中添加高斯噪声
def gasuss_noise(image, mean=0, var=0.001): # mean : 均值,var : 方差
image = np.array(image/255, dtype=float)
noise = np.random.normal(mean, var ** 0.5, image.shape) # 使用numpy库中的函数生成正态分布矩阵,对应数据分别为概率均值,概率标准差,图像的大小
output = image + noise # 输出结果为原图灰度级概率与噪声概率相加
output_handle = np.array([[[0]*3 for i in range(output.shape[1])] for i in range(output.shape[0])], dtype=float)
# 处理后最终输出矩阵将齐大小设置为与原图一样
if output.min() < 0: # 确定一个比较中间值
low_clip = -1.
else:
low_clip = 0.
for i in range (output.shape[0]): # 遍历整个三位矩阵
for j in range (output.shape[1]):
for k in range (output.shape[2]):
if output[i][j][k] < low_clip: # 将输出的概率矩阵内的值限定在(-1,1)范围内
output_handle[i][j][k] = low_clip # 使其之后*255变为灰度级时不会超出[0-255]的范围
elif output[i][j][k] > 1.0:
output_handle[i][j][k] = 1.0
else:
output_handle[i][j][k] = output[i][j][k] # 在最大值和最小值之间的不变
output = np.uint8(output_handle*255) # 将处理后的灰度级转化为[0-255]的整数级
return output
加性噪声:
# 向图片中添加加性噪声
def addrandom_noise(image,prob=0.1):
output = image # 将原始图像数据拷贝至输出矩阵
n = random.randint(1, 1000) + int(prob*20000)
for k in range(n-500):
a = random.randint(0, 50)
b = random.randint(0, 50)
c = random.randint(0, 50)
i = random.randint(0, image.shape[0]-1)
j = random.randint(0, image.shape[1]-1)
output[i][j][0] = 255-a
output[i][j][1] = 255-b
output[i][j][2] = 255-c
for k in range(n):
a = random.randint(0, 50)
b = random.randint(0, 50