当前位置:   article > 正文

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

python opencv 二值化

一、二值化

二值化指的是讲原图通过阈值把像素值都置为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	#大于阈值的部分取阈值,小于等于阈值的部分不变
'''
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
(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)  # 等待时间

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

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

2、HSV图像二值化

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

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

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

二、滤波操作

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

1、均值滤波

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

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

2、中值滤波

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

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

3、高斯滤波

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

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

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

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

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)  # 等待时间

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/954899
推荐阅读
相关标签
  

闽ICP备14008679号