OpenCV python图像预处理:二值化 && 滤波操作
Posted 笠li笠
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV python图像预处理:二值化 && 滤波操作相关的知识,希望对你有一定的参考价值。
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) # 等待时间
效果如下所示:
关于滤波方法的选择,个人理解是高斯滤波的适用性和性能都不错,一般降噪的需求下都可以使用高斯滤波。而如上图所示,如果是要去除一些较大的噪声点,中值滤波的效果相对会较差,反而在这种情况下,取平均值会比取中值更合适一些。相反,当噪声点很小时,中值滤波就能有很好的效果而且不会对原图像造成什么模糊的后果,反观均值滤波则是会将图像的许多特征消除掉,如果是特征不明显或者是需求不能有模糊的图像时,则不能使用均值滤波,而高斯滤波则是适中的。
本人是一名学生,目前正在学习中,本篇文章也算是我的学习笔记,如有错误的话还请指正。
以上是关于OpenCV python图像预处理:二值化 && 滤波操作的主要内容,如果未能解决你的问题,请参考以下文章
OpenCV python图像预处理:二值化 && 滤波操作