PythonOpenCV-图像变换-图像模糊
0. 简介
图像模糊又称图像平滑处理。其主要处理图像中与周围差异较大的点,将其像素值调整为与周围相似的值,其主要目的是消除图像噪声和边缘。
1. 均值滤波
均值滤波是指以当前点为中心,用其周围N*N个点像素值的平均值来代替当前点的像素值。
用来计算平均值的N*N的点成为邻域,用于滤波计算的卷积核大小与邻域相同。
OpenCv中用cv2.blur()函数实现,其基本格式如下:
dst = cv2.blur(src, ksize [, anchor [, borderType]])
参数说明:
dst:滤波结果图像
src:原图像
ksize:卷积核大小,表示为(width, height), width和height通常设置为相同值,且为正数和奇数
anchor:锚点,默认值为(-1, -1),表示锚点位于卷积核中心
borderType:边界值处理方式
代码示例:
import cv2 as cv img_src = cv.imread('Pictures/lena.jpg') cv.imshow('src', img_src) img_blur = cv.blur(img_src, (5, 5)) cv.imshow('blur', img_blur) cv.waitKey(0)
运行结果:
2. 高斯滤波
高斯滤波与均值滤波略有不同,它按像素点与中心点的不同距离,赋予像素点不同的权重值,越靠近中心点权重值越大,越远离中心点权重值越小,然后根据权重值计算邻域内所有像素点的和,将和作为中心点的像素值。
OpenCV的 cv2.GaussianBlur()函数用于实现高斯滤波,其基本格式如下:
dst = cv2.GaussianBlur(src, ksize, sigmaX [, sigmaY [, borderType]])
参数说明:
dst:滤波结果图像
src:原图像
ksize:卷积核大小
sigmaX:水平方向的权重值
sigmaY:垂直方向的权重值
borderType:边界值处理方式
代码示例:
import cv2 as cv img_src = cv.imread('Pictures/lena.jpg') cv.imshow('src', img_src) img_GaussianBlur = cv.GaussianBlur(img_src, (5, 5), 0.9) cv.imshow('GaussianBlur', img_GaussianBlur) cv.waitKey(0)
运行结果:
3. 方框滤波
方框滤波以均值滤波为基础,可选择是否对滤波结果进行归一化,如果选择进行归一化,则滤波结果为邻域内点的像素值之和的平均值,否则滤波结果为像素值之和。
OpenCV的 cv2.boxFilter()函数用于实现方框滤波,其基本格式如下:
dst = cv2.boxFilter(src, ddepth, ksize[, anchor[, normalize[, borderType]]])
参数说明:
dst:滤波结果图像
src:原图像
ddepth:目标图像的深度,一般使用-1表示与原图深度一样
ksize:卷积核大小,表示为(width, height), width和height通常设置为相同值,且为正数和奇数
anchor:锚点,默认值为(-1, -1),表示锚点位于卷积核中心
normalize:可设置为True或False,表示是否归一化
borderType:边界值处理方式
代码示例:
import cv2 as cv img_src = cv.imread('Pictures/lena.jpg') cv.imshow('src', img_src) img_boxFilter = cv.boxFilter(img_src, -1, (3, 3), normalize=True) cv.imshow('boxFilter', img_boxFilter) cv.waitKey(0)
运行结果:
4. 中值滤波
中值滤波将邻域内的所有像素值排序,取中间值作为邻域中心点的像素值
OpenCV的cv2.medianBlur()函数用于实现中值滤波,其基本格式如下:
dst = cv2.medianBlur(src, ksize)
参数说明:
dst:滤波结果图像
src:原图像
ksize:卷积核大小,必须是大于1的奇数
代码示例:
import cv2 as cv img_src = cv.imread('Pictures/lena.jpg') cv.imshow('src', img_src) img_medianBlur = cv.medianBlur(img_src, 21) cv.imshow('medianBlur', img_medianBlur) cv.waitKey(0)
运行结果:
5. 双边滤波
双边滤波在计算像素值的同时会考虑距离和色差信息,从而可在消除噪声的同时保护边缘信息。
在执行双边滤波操作时,如果像素点与当前点色差较小,则赋予其较大的权重值,否则赋予其较小的权重值。
OpenCV的cv2.bilateralFilter()函数用于实现双边滤波,其基本格式如下:
dst =cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace[, borderType])
参数说明:
dst:滤波结果图像
src:原图像
d:以当前点为中心的邻域的直径,一般为5
sigmaColor:双边滤波选择的色差范围
sigmaSpace:空间坐标中的sigma值,值越大表示越多的像素点参与滤波计算。当d>0时,忽略sigmaSpace,由d决定邻域大小;否则d由sigmaSpace计算得出,与sigmaSpace成比例。
borderType:边界值处理方式
代码示例:
import cv2 as cv img_src = cv.imread('Pictures/pepper_dog.png') cv.imshow('src', img_src) img_dst1 = cv.bilateralFilter(img_src, 20, 100, 100) cv.imshow('bilateralFilter', img_dst1) cv.waitKey(0)
运行结果:
6. 2D卷积
均值滤波、高斯滤波、方框滤波、中值滤波和双边滤波等可以通过参数来确定卷积核,2D 卷积可使用自定义的卷积核来执行滤波操作。
OpenCV的 cv2.filter2D()函数用于实现 2D 卷积,其基本格式如下:
dst = cv2.filter2D(src, ddepth, kernel[, anchor[, delta[, borderType]]])
参数说明:
dst:滤波结果图像
src:原图像
ddepth:目标图像的深度,一般使用-1表示与原图深度一样
kernel:单通道卷积核(一维数组 )
anchor:锚点,默认值为(-1, -1),表示锚点位于卷积核中心
delta:修正值,未省略时,将加上该值作为最终的滤波结果
borderType:边界值处理方式
代码示例:
import cv2 as cv import numpy as np img_src = cv.imread('Pictures/pepper_dog.png') cv.imshow('src', img_src) k1 = np.array([[3, 3, 3, 3, 3], [3, 9, 9, 9, 3], [3, 11, 11, 11, 3], [3, 8, 8, 8, 3], [3, 3, 3, 3, 3]]) / 25 # 自定义卷积核1 k2 = np.ones((5, 5), np.float32) / 25 # 自定义卷积核2 img_dst1 = cv.filter2D(img_src, -1, k1) cv.imshow('dst1', img_dst1) img_dst2 = cv.filter2D(img_src, -1, k2) cv.imshow('dst2', img_dst2) cv.waitKey(0)
运行结果:
/*-------------------------------------------------------------------------------------------------------
笔者说明:
该笔记来源于本人学习Python + OpenCv时的资料,
分享出来只是为了供大家学习,并且为了自己以后想要用的时候方便寻找。
时间:2023年8月22日
------------------------------------------------------------------------------------------------------------*/