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

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

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

  • 10
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
利用pythonopencv库实现照片的预处理非常简单。首先,我们可以使用高斯平滑滤波来消除照片中的噪声,并使图像变得更加平滑。通过调整滤波器大小和标准差,我们可以控制平滑程度。 接下来,我们可以使用直方图均衡化来增加图像的对比度。直方图均衡化会通过重新分配图像的亮度级别来增强图像的细节。这可以通过对图像的像素值进行转换实现。 然后,我们可以将图像转换为灰度图像。灰度变换将图像从彩色转换为灰度级。这可以通过将红、绿和蓝通道的像素值的平均值分配给灰度图像的每个像素来实现。 最后,我们可以使用二值化将图像转换为二值图像。二值化会根据像素的灰度级别将其分类为黑色或白色。这可以用来简化图像,并提取图像中的特定特征。 下面是一个示例代码,展示如何使用pythonopencv库实现照片的预处理: ```python import cv2 # 读取照片 image = cv2.imread('photo.jpg') # 高斯平滑滤波 smoothed_image = cv2.GaussianBlur(image, (5, 5), 0) # 提高对比度 equalized_image = cv2.equalizeHist(smoothed_image) # 灰度变换 gray_image = cv2.cvtColor(equalized_image, cv2.COLOR_BGR2GRAY) # 二值化 _, threshold_image = cv2.threshold(gray_image, 128, 255, cv2.THRESH_BINARY) # 显示结果 cv2.imshow('Original Image', image) cv2.imshow('Preprocessed Image', threshold_image) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在这个示例中,我们首先加载了要处理的照片。然后,我们根据需要应用了高斯平滑滤波、对比度增强、灰度变换和二值化。最后,我们显示了原始图像和预处理后的图像。 注意:在实际应用中,可能需要根据具体需求进行一些参数的调整,比如滤波器大小、对比度增强的方法等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超级大魔王li

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值