总结
- 图像噪声
• 椒盐噪声:图像中随机出现的白点或者黑点
• 高斯噪声:噪声的概率密度分布是正态分布 - 图像平滑
• 均值滤波:算法简单,计算速度快,在去噪的同时去除了很多细节部分,将图像变得模糊
cv.blur()
• 高斯滤波: 去除高斯噪声
cv.GaussianBlur()
• 中值滤波: 去除椒盐噪声
cv.medianBlur()
显示图像总结
subplots(nrows=1, ncols=1, sharex=False, sharey=False, squeeze=True,
subplot_kw=None, gridspec_kw=None, **fig_kw)
fig,axes=plt.subplots(nrows=1,ncols=2,figsize=(10,8),dpi=100)
行数 列数 每个图的大小 分辨率
axes[0].imshow(img3[:,:,::-1])
axes[0].set_title(“cv中的加法”)
axes[1].imshow(img4[:,:,::-1])
axes[1].set_title(“直接相加”)
1.1 椒盐噪声 / 脉冲噪声
随机出现的白点或者黑点,可能是亮的区域有黑色像素或是在暗的区域有白色像素(或是两者皆有)。椒盐噪声的成因可能是影像讯号受到突如其来的强烈干扰而产生、类比数位转换器或位元传输错误等。例如失效的感应器导致像素值为最小值,饱和的感应器导致像素值为最大值。
1.2 高斯噪声 / 正态噪声
高斯随机变量z的概率密度函数由下式给出:
2 图像平滑简介
图像平滑从信号处理的角度看就是去除其中的高频信息,保留低频信息。因此我们可以对图像实施低通滤波。低通滤波可以去除图像中的噪声,对图像进行平滑。
根据滤波器的不同可分为均值滤波,高斯滤波,中值滤波, 双边滤波。
2.1 均值滤波
cv.blur(src, ksize, anchor, borderType)
参数:
® src:输入图像
® ksize:卷积核的大小
® anchor:默认值 (-1,-1) ,表示核中心
® borderType:边界类型
2.2 高斯滤波
高斯滤波函数如下
函数对应的图---固定长这样子的
特点:
正态分布是一种钟形曲线,越接近中心,取值越大,越远离中心,取值越小。计算平滑结果时,只需要将"中心点"作为原点,其他点按照其在正态曲线上的位置,分配权重,就可以得到一个加权平均值。
高斯平滑在从图像中去除高斯噪声方面非常有效。
高斯核 ↑
离中心点越近的值应该发挥效果应当越强(关系越大), 中心点远的效果弱
…
通过高斯平滑可以去除高斯噪声
API:
cv2.GaussianBlur(src,ksize,sigmaX,sigmay,borderType)
参数:
® src: 输入图像
® ksize:高斯卷积核的大小,注意 : 卷积核的宽度和高度都应为奇数,且可以不同
® sigmaX: 水平方向的标准差
® sigmaY: 垂直方向的标准差,默认值为0,表示与sigmaX相同
® borderType:填充边界类型
2.3 中值滤波
API:
cv.medianBlur(src, ksize )
参数:
§ src:输入图像
§ ksize:卷积核的大小
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
# 1 图像读取
img = cv.imread('opencv_learn/middle.png')
print(img)
# 2 高斯滤波
blur = cv.GaussianBlur(img,(5,5),1)
# 中值滤波
cv.medianBlur(img,5)
# 3 图像显示
plt.figure(figsize=(10,8),dpi=100)
plt.subplot(121),plt.imshow(img[:,:,::-1]),plt.title('原图')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(blur[:,:,::-1]),plt.title('高斯滤波后结果')
plt.xticks([]), plt.yticks([])
plt.show()
添加椒盐噪声
def noise(img,snr):
h=img.shape[0]
w=img.shape[1]
img1=img.copy()
sp=hw # 计算图像像素点个数
NP=int(sp(1-snr)) # 计算图像椒盐噪声点个数
for i in range (NP):
randx=np.random.randint(1,h-1) # 生成一个 1 至 h-1 之间的随机整数
randy=np.random.randint(1,w-1) # 生成一个 1 至 w-1 之间的随机整数
if np.random.random()<=0.5: # np.random.random()生成一个 0 至 1 之间的浮点数
img1[randx,randy]=0
else:
img1[randx,randy]=255
return img1