高斯平滑
高斯平滑即采用高斯卷积核对图像矩阵进行卷积操作。高斯卷积核是一个近似服从高斯分布的矩阵,随着距离中心点的距离增加,其值变小。这样进行平滑处理时,图像矩阵中锚点处像素值权重大,边缘处像素值权重小。
import cv2 as cv
import matplotlib.pyplot as plt
import numpy as np
from cv2 import GaussianBlur
img = cv.imread(r"C:\Users\mzd\Desktop\opencv\images.jpg")
img_gauss = cv.GaussianBlur(img,(3,3),1) #opencv中提供了GaussianBlur()函数来进行高斯平滑
cv.imshow("img",img) #显示原图
cv.imshow("img_gauss",img_gauss) #显示高斯平滑图
cv.waitKey(0) #参数为 0,表示程序会无限期地等待用户按下键盘上的任意键。
cv.destroyAllWindows() #cv.destroyAllWindows() 是 OpenCV 中的一个函数调用,用于关闭所有通过 cv2.imshow() 打开的图像窗口。这个函数没有参数,调用它会关闭当前打开的所有窗口。
GaussianBlur()
代码使用示例和效果如下:(相比于原图,平滑后图片变模糊)
cv2.GaussianBlur()
是 OpenCV 中用于对图像进行高斯模糊(Gaussian Blur)的函数。高斯模糊是一种常用的图像平滑技术,它可以有效地去除图像中的噪声,使图像变得更加平滑。
该函数的基本语法如下:
cv2.GaussianBlur(src, ksize, sigmaX[, dst[, sigmaY[, borderType]]])
参数说明:
src
: 输入图像。ksize
: 高斯核的大小。通常为正的奇数(如3、5、7…)。高斯核的大小影响了模糊的程度。sigmaX
: X 方向上的高斯核标准差。如果设为0,则根据ksize
计算。dst
(可选): 输出图像。sigmaY
(可选): Y 方向上的高斯核标准差。如果设为0,则与sigmaX
相等。borderType
(可选): 边界处理的方式,通常为默认值cv2.BORDER_DEFAULT
。
均值平滑
import cv2 as cv
import matplotlib.pyplot as plt
import numpy as np
img = cv.imread(r"C:\Users\mzd\Desktop\opencv\images.jpg")
img_blur = cv.blur(img,(3,5)) #均值平滑
# img_blur = cv.boxFilter(img,-1,(3,5))
cv.imshow("img",img)
cv.imshow("img_blur",img_blur)
cv.waitKey(0)#参数为 0,表示程序会无限期地等待用户按下键盘上的任意键
cv.imshow("img",img)
cv.destroyAllWindows()#cv.destroyAllWindows() 是 OpenCV 中的一个函数调用,用于关闭所有通过 cv2.imshow() 打开的图像窗口。这个函数没有参数,调用它会关闭当前打开的所有窗口。
cv2.blur()
是 OpenCV 中用于对图像进行均值模糊(Blur)的函数。均值模糊是一种简单的平滑技术,它通过取图像局部区域的平均值来模糊图像,从而实现去噪的效果。
该函数的基本语法如下:
cv2.blur(src, ksize[, dst[, anchor[, borderType]]])
参数说明:
src
: 输入图像。ksize
: 决定了模糊程度的核的大小。通常为正的奇数(如3、5、7…)。dst
(可选): 输出图像。anchor
(可选): 锚点,默认值(-1, -1)
表示核的中心。borderType
(可选): 边界处理的方式,通常为默认值cv2.BORDER_DEFAULT
。
中值平滑
中值平滑也有核,但并不进行卷积计算,而是对核中所有像素值排序得到中间值,用该中间值来代替锚点值。opencv中利用medianBlur()来进行中值平滑,中值平滑特别适合用来去除椒盐噪声。
import cv2 as cv
import matplotlib.pyplot as plt
import numpy as np
import random
img = cv.imread(r"C:\Users\mzd\Desktop\opencv\images.jpg")
rows,cols = img.shape[:2]
#加入椒盐噪声
for i in range(100):
r = random.randint(0,rows-1)
c = random.randint(0,cols-1)
img[r,c]=255
img_medianblur = cv.medianBlur(img,5)
cv.imshow("img",img)
cv.imshow("img_medianblur",img_medianblur)
cv.waitKey(0)
cv.destroyAllWindows()
cv2.medianBlur()
是 OpenCV 中用于对图像进行中值模糊的函数。中值模糊是一种非线性的平滑技术,它将每个像素的值替换为相应邻域中所有像素的中值。这种方法对于去除图像中的椒盐噪声等离群点非常有效。
该函数的基本语法如下:
cv2.medianBlur(src, ksize[, dst])
参数说明:
src
: 输入图像。ksize
: 决定了模糊程度的核的大小。通常为正的奇数(如3、5、7…)。dst
(可选): 输出图像。
双边滤波
相比于上面几种平滑算法,双边滤波在平滑的同时还能保持图像中物体的轮廓信息。双边滤波在高斯平滑的基础上引入了灰度值相似性权重因子,所以在构建其卷积核核时,要同时考虑空间距离权重和灰度值相似性权重。在进行卷积时,每个位置的邻域内,根据和锚点的距离d构建距离权重模板,根据和锚点灰度值差异r构建灰度值权重模板,结合两个模板生成该位置的卷积核。
#coding:utf-8
import cv2 as cv
import matplotlib.pyplot as plt
import numpy as np
import random
import math
img = cv.imread(r"C:\Users\mzd\Desktop\opencv\images.jpg")
img_bilateral = cv.bilateralFilter(img,0,0.2,40)
cv.imshow("img",img)
cv.imshow("img_bilateral",img_bilateral)
cv.waitKey(0)
cv.destroyAllWindows()
cv2.bilateralFilter()
是 OpenCV 中用于进行双边滤波的函数。双边滤波是一种非线性滤波技术,它考虑了像素之间的空间距离和像素值之间的灰度相似性。这使得双边滤波能够在平滑图像的同时保留边缘。
该函数的基本语法如下:
cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace[, dst[, borderType]])
参数说明:
src
: 输入图像。d
: 领域直径。如果非正数,会从sigmaSpace
计算。sigmaColor
: 色彩空间的标准差。较大的值表示在颜色空间中考虑更广泛的区域。sigmaSpace
: 坐标空间的标准差。较大的值表示在空间中考虑更广泛的区域。dst
(可选): 输出图像。borderType
(可选): 边界处理的方式,通常为默认值cv2.BORDER_DEFAULT
。