OpenCV python(四)图像预处理:二值化 && 滤波操作

一、二值化

二值化指的是讲原图通过阈值把像素值都置为0或255,最终得到一张像素值都为0或255的一维图像。一般情况下,我们获取的或者颜色空间转换后的图像都为3通道数的图像,通过二值化可以去掉大部分无用的信息,保留需要的信息的同时将其分为0或255两类黑点和白点,并将3通道数的图像降维成1通道数的图像,既可以排除了大部分无用信息,也减少了计算量。二值化是图像处理中经常用到的图像预处理方法,以下为两种常见的二值化方法。

1、灰度图二值化

(1)、threshold函数

以下为opencv-python提供的灰度图二值化函数:

t,img_bin = cv2.threshold(img,thresh,maxval,type)	#二值化,阈值设置
'''
其中t为阈值,img_bin为输出图; img为输入图像,thresh为阈值,maxval为最大值,
type为模式,如下所示:
cv2.THRESH_BINARY	#大于阈值的部分取最大值,小于等于阈值的部分取0
cv2.THRESH_BINARY_INV	#大于阈值的部分取0,小于等于阈值的部分取最大值
cv2.THRESH_TOZERO	#大于阈值的部分不变,小于等于阈值的部分取0
cv2.THRESH_TOZERO_INV	#大于阈值的部分取0,小于等于阈值的部分不变
cv2.THRESH_TRUNC	#大于阈值的部分取阈值,小于等于阈值的部分不变
'''

(2)、案例

程序如下所示:

import cv2  # 导入opencv库

if __name__ == '__main__':
    while True:
        img_g = cv2.imread('img/6.jpg', 0)    # 获取路径img/0.jpg的图像,图像类型为RGB图像

        t, img_bin = cv2.threshold(img_g, 180, 255, cv2.THRESH_BINARY)  # 二值化

        cv2.imshow("img_g", img_g)  # 显示RGB图像
        cv2.imshow("img_bin", img_bin)  # 显示二值化图像

        cv2.waitKey(1)  # 等待时间

效果如下所示:
在这里插入图片描述

2、HSV图像二值化

以下为opencv-python提供的HSV图像二值化函数:

img_bin = cv2.inRange(img_hsv, lower, upper)	#低于lower、高于upper为0,中间为255

HSV图像二值化在第三篇文章中有介绍到,也带有案例,在颜色识别那块:OpenCV python(三)【图像预处理:颜色空间转换】 && 颜色识别
效果如下图所示:
在这里插入图片描述

二、滤波操作

滤波是图像预处理降噪环节不可缺少的一部分,其可在不影响原图像主要特征的情况下,去除大部分噪音,决定了后续的图像质量,极大降低了后续图像处理的复杂程度。

1、均值滤波

均值滤波为线性滤波,均值滤波的原理是取周围像素点的平均值作为中间点的值,如若为边缘点,此时没能满足四周都有像素点的情况,那么将用核内剩余所有像素点求平均值作为此边缘像素点的值。但是遍历整张图像后,会导致图像变得非常模糊,因此均值滤波方法可能会丢失过多图像原本的特征。
cv2.blur为opencv-python提供的均值滤波函数,具体如下所示:

img_blur = cv2.blur(img, (x, x))		# 均值滤波

2、中值滤波

中值滤波的原理则是规定坐标中不含边缘点,取核内所有数的中数作为中间点的值(此处边缘点处理只是一种方法,不代表OpenCV提供函数所使用的方法,也有可能采用镜像的方法,或者是和均值滤波一样使用核内剩余所有像素点进行中值筛选)
cv2.medianBlur为opencv-python提供的中值滤波函数,具体如下所示:

cv2.medianBlur(img, x)			# 中值滤波

3、高斯滤波

使用高斯滤波首先确认一个奇数的核(此核的大小需为奇数,因为只有奇数×奇数的核才有一个中心点,这是高斯滤波原理必须满足的条件),如果不是奇数核会直接报错,错误如下。

cv2.error: (-215:Assertion failed) ksize.width > 0 && ksize.width % 2 == 1 && ksize.height > 0 && ksize.height % 2 == 1 in function 'cv::createGaussianKernels'

高斯滤波的原理是将与高斯核相同尺寸的数组与高斯核相乘,再相加,求得的数为中心点的值
cv2.GaussianBlur为opencv-python提供的高斯滤波函数,具体如下所示:

cv2.GaussianBlur(img, (x, x), 0)	# 高斯滤波

4、案例

具体代码如下所示:

import cv2  # 导入opencv库

if __name__ == '__main__':
    while True:
        img_g = cv2.imread('img/6.jpg', 0)    # 获取路径img/0.jpg的图像,图像类型为RGB图像
        img_g = cv2.resize(img_g, (0, 0), fx=0.5, fy=0.5)  # 改变图像shape

        img_blur = cv2.blur(img_g, (5, 5))  # 均值滤波
        img_medianBlur = cv2.medianBlur(img_g, 5)			# 中值滤波
        img_GaussianBlur = cv2.GaussianBlur(img_g, (5, 5), 0)  # 高斯滤波

        t1, img_g_bin = cv2.threshold(img_g, 170, 255, cv2.THRESH_BINARY)  # 二值化
        t2, img_blur_bin = cv2.threshold(img_blur, 170, 255, cv2.THRESH_BINARY)  # 二值化
        t3, img_medianBlur_bin = cv2.threshold(img_medianBlur, 170, 255, cv2.THRESH_BINARY)  # 二值化
        t4, img_GaussianBlur_bin = cv2.threshold(img_GaussianBlur, 170, 255, cv2.THRESH_BINARY)  # 二值化

        cv2.imshow("img_g", img_g)  # 显示RGB图像
        cv2.imshow("img_g_bin", img_g_bin)  # 显示二值化图像
        cv2.imshow("img_blur", img_blur)    # 显示均值滤波后的图像
        cv2.imshow("img_blur_bin", img_blur_bin)    # 显示均值滤波后的二值化图像
        cv2.imshow("img_medianBlur", img_medianBlur)    # 显示中值滤波后的图像
        cv2.imshow("img_medianBlur_bin", img_medianBlur_bin)    # 显示中值滤波后的二值化图像
        cv2.imshow("img_GaussianBlur", img_GaussianBlur)    # 显示高斯滤波后的图像
        cv2.imshow("img_GaussianBlur_bin", img_GaussianBlur_bin)    # 显示高斯滤波后的二值化图像

        cv2.waitKey(1)  # 等待时间

效果如下所示:
在这里插入图片描述
关于滤波方法的选择,个人理解是高斯滤波的适用性和性能都不错,一般降噪的需求下都可以使用高斯滤波。而如上图所示,如果是要去除一些较大的噪声点,中值滤波的效果相对会较差,反而在这种情况下,取平均值会比取中值更合适一些。相反,当噪声点很小时,中值滤波就能有很好的效果而且不会对原图像造成什么模糊的后果,反观均值滤波则是会将图像的许多特征消除掉,如果是特征不明显或者是需求不能有太模糊的图像时,则不能使用均值滤波。

本人是一名学生,目前正在学习中,本篇文章也算是我的学习笔记,如有错误的话还请指正。

猜你喜欢

转载自blog.csdn.net/xztli/article/details/126175975
今日推荐