一、图像噪声
由于图像采集、处理、传输等过程不可避免的会受到噪声的污染,妨碍人们对图像理解及分析处理。常见的图像噪声有高斯噪声、椒盐噪声等。
1、椒盐噪声
2、高斯噪声
高斯噪声是指噪声的密度服从高斯分布的一类噪声,由于高斯噪声在空间和频域中数学上的易处理性,这种噪声(也称为正态噪声)模型经常被用于实践中。高斯噪声随机变量Z的概率密度函数由下式给出:
加入高斯噪声后的效果:
二、图像平滑
图像平滑从信号处理的角度看就是去除其中的高频信息,保留低频信息。因此我们可以对图像实施低通滤波。低通滤波可以去除图像中的噪声,对图像进行平滑。
- 根据滤波器的不同可以分为:均值滤波、高斯滤波、中值滤波、双边滤波
- 我们认为高频信息就是噪声,低频信息就是有用的内容。
1、均值滤波
(1)API介绍
(2)实例分析
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import font_manager
#字体设置
my_font = font_manager.FontProperties(fname="C:/Windows/Fonts/STHUPO.TTF")
#1、读取图像
img = cv.imread("./images/girl.jpg")
#2、均值滤波
blur = cv.blur(img, (5,5))
#3、图像显示
plt.figure(figsize=(10,8), dpi=100)
# subplot中的121代表[1,2,1],表示在本区域里显示1行2列个图像,最后的1表示本图像显示在第一个位置。
plt.subplot(121)
plt.imshow(img[:,:,::-1])
plt.title("原图", fontproperties=my_font)
plt.xticks([]), plt.yticks([])
plt.subplot(122)
plt.imshow(blur[:,:,::-1])
plt.title("均值滤波后的结果", fontproperties=my_font)
plt.xticks([]), plt.yticks([])
plt.show()
2、高斯滤波
图像是二维的,所以使用二维高斯分布。
(1)高斯平滑的流程
<1> 首先确定权重矩阵
更远的点以此类推。为了计算权重矩阵,需要设定 σ 的值。假定 σ = 1.5,则模糊半径为1的权重矩阵如下:
这9个点的权重总和等于0.4787147,如果只计算这9个点的加权平均,还必须让他们的权重之和等于1,因此上面9个值还要分别除以0.4787147(相当于做了一个归一化),得到最终的权重矩阵。
<2> 进行高斯模糊
每个点乘以对应的权重值:
将这9个值加起来,就是中心点的高斯模糊的值。对所有的点重复上述过程,就得到了高斯模糊后的图像,如果原图像是彩色图片,可以对RGB三个通道分别做高斯平滑。
(2)API介绍
(3)简单案例
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
from matplotlib import font_manager
#字体设置
my_font = font_manager.FontProperties(fname="C:/Windows/Fonts/STHUPO.TTF")
#1、读取图像
img = cv.imread("images/opencv-logo-white.png")
#2、高斯滤波
blur = cv.GaussianBlur(img, (3,3), 1)
#3、图像显示
plt.figure(figsize=(10, 8), dpi=100)
plt.subplot(121)
plt.imshow(img[:,:,::-1])
plt.title("原图", fontproperties=my_font)
plt.xticks([]), plt.yticks([])
plt.subplot(122)
plt.imshow(blur[:,:,::-1])
plt.title("高斯滤波后的结果", fontproperties=my_font)
plt.xticks([]), plt.yticks([])
plt.show()
3、中值滤波
中值滤波是一种典型的非线性滤波技术,基本思想是用像素点邻域灰度值的中值来代替该像素点的灰度值。
中值滤波对椒盐噪声(salt-and-pepper noise)来说尤其有用,因为他不依赖于邻域内那些与典型值差别很大的值。
(1)API介绍
顾名思义,函数 cv.medianBlur() 取卷积核区域下所有像素的中值,并用该中值替换中心元素。这对去除图像中的椒盐噪声非常有效。有趣的是,在上述滤波器中,中心元素是新计算的值,其可以是图像中的像素值或新值。但在中值模糊中,中心元素总是被图像中的某个像素值替换,它有效地降低了噪音。 其卷积核大小应为正整数。
(2)案例分析
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
from matplotlib import font_manager
#字体设置
my_font = font_manager.FontProperties(fname="C:/Windows/Fonts/STHUPO.TTF")
#1、读取图片
img = cv.imread('images/board.tif')
img = cv.cvtColor(img, cv.COLOR_BGR2RGBA)
#中值滤波
median = cv.medianBlur(img,5)
plt.subplot(121),plt.imshow(img),plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(median),plt.title('Median')
plt.xticks([]), plt.yticks([])
plt.show()