您的位置:首页 > 游戏 > 游戏 > 【OpenCV-阈值与平滑处理】灰度图、HSV、图像阈值、图像平滑处理(方框滤波、均值滤波、高斯滤波、中值滤波)

【OpenCV-阈值与平滑处理】灰度图、HSV、图像阈值、图像平滑处理(方框滤波、均值滤波、高斯滤波、中值滤波)

2024/12/28 19:04:14 来源:https://blog.csdn.net/weixin_44145338/article/details/142062409  浏览:    关键词:【OpenCV-阈值与平滑处理】灰度图、HSV、图像阈值、图像平滑处理(方框滤波、均值滤波、高斯滤波、中值滤波)

1 灰度图

import cv2  # 导入 OpenCV 库,用于图像处理
import numpy as np  # 导入 NumPy 库,用于数组操作
import matplotlib.pyplot as plt  # 导入 Matplotlib 库,用于绘图# %matplotlib inline 是 Jupyter Notebook 特有的魔法命令,用于在 notebook 中内联显示 Matplotlib 绘图# 读取图像文件
img = cv2.imread('./img/cat.jpg')  # 使用 OpenCV 的 imread 函数读取图像文件,路径为 './img/cat.jpg'
# 默认情况下,OpenCV 使用 BGR 色彩空间# 将图像转换为灰度图像
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 使用 cvtColor 函数将 BGR 图像转换为灰度图像# 获取灰度图像的形状
img_gray.shape  # 返回图像的形状,格式为 (高度, 宽度),例如 (414, 500)cv2.imshow("img_gray", img_gray)
cv2.waitKey(0)    
cv2.destroyAllWindows() 

2 HSV

  • H - 色调(主波长)。
  • S - 饱和度(纯度/颜色的阴影)。
  • V值(强度)
import cv2  # 导入 OpenCV 库# 将 BGR 图像转换为 HSV 色彩空间
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)  # 使用 cvtColor 函数将 BGR 图像转换为 HSV 图像
# HSV 色彩空间包含色调(H)、饱和度(S)和明度(V)三个通道# 显示转换后的 HSV 图像
cv2.imshow("hsv", hsv)  # 使用 imshow 函数显示图像,窗口标题为 "hsv"# 等待用户按键
cv2.waitKey(0)  # 等待用户按键,无参数表示无限等待,直到按下任意键# 关闭所有 OpenCV 窗口
cv2.destroyAllWindows()  # 关闭所有由 imshow 函数创建的窗口

3 图像阈值

  • ret, dst = cv2.threshold(src, thresh, maxval, type)

  • src: 输入图,只能输入单通道图像,通常来说为灰度图

  • dst: 输出图

  • thresh: 阈值

  • maxval: 当像素值超过了阈值(或者小于阈值,根据type来决定),所赋予的值

  • type:二值化操作的类型,包含以下5种类型: cv2.THRESH_BINARY; cv2.THRESH_BINARY_INV; cv2.THRESH_TRUNC; cv2.THRESH_TOZERO;cv2.THRESH_TOZERO_INV

  • cv2.THRESH_BINARY 超过阈值部分取maxval(最大值),否则取0

  • cv2.THRESH_BINARY_INV THRESH_BINARY的反转

  • cv2.THRESH_TRUNC 大于阈值部分设为阈值,否则不变

  • cv2.THRESH_TOZERO 大于阈值部分不改变,否则设为0

  • cv2.THRESH_TOZERO_INV THRESH_TOZERO的反转

import cv2
import matplotlib.pyplot as plt# 对灰度图像应用不同的阈值处理方法
# img_gray 是输入的灰度图像
# cv2.threshold() 函数用于将图像转换为二值图像,并应用不同的阈值处理方法# 使用阈值 127 和最大值 255 进行二值化
# cv2.THRESH_BINARY:像素值大于阈值设为最大值,其他设为 0
ret, thresh1 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY)# 使用阈值 127 和最大值 255 进行反向二值化
# cv2.THRESH_BINARY_INV:像素值小于阈值设为最大值,其他设为 0
ret, thresh2 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY_INV)# 使用阈值 127 和最大值 255 进行截断
# cv2.THRESH_TRUNC:像素值大于阈值设为阈值,其他保持不变
ret, thresh3 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TRUNC)# 使用阈值 127 和最大值 255 进行零化
# cv2.THRESH_TOZERO:像素值大于阈值保持不变,其他设为 0
ret, thresh4 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TOZERO)# 使用阈值 127 和最大值 255 进行反向零化
# cv2.THRESH_TOZERO_INV:像素值小于阈值保持不变,其他设为 0
ret, thresh5 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TOZERO_INV)# 创建标题和图像列表用于显示
titles = ['Original Image', 'BINARY', 'BINARY_INV', 'TRUNC', 'TOZERO', 'TOZERO_INV']
images = [img_gray, thresh1, thresh2, thresh3, thresh4, thresh5]# 使用 matplotlib 显示图像
# 创建一个 2x3 的图像网格进行显示
for i in range(6):plt.subplot(2, 3, i + 1)  # 创建子图plt.imshow(images[i], 'gray')  # 显示图像,使用灰度色彩图plt.title(titles[i])  # 设置子图标题plt.xticks([])  # 隐藏 x 轴刻度plt.yticks([])  # 隐藏 y 轴刻度# 显示所有子图
plt.show()

在这里插入图片描述

4 图像平滑处理

import cv2  # 导入 OpenCV 库# 将 BGR 图像转换为 HSV 色彩空间
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)  # 使用 cvtColor 函数将 BGR 图像转换为 HSV 图像
# HSV 色彩空间包含色调(H)、饱和度(S)和明度(V)三个通道# 显示转换后的 HSV 图像
cv2.imshow("hsv", hsv)  # 使用 imshow 函数显示图像,窗口标题为 "hsv"# 等待用户按键
cv2.waitKey(0)  # 等待用户按键,无参数表示无限等待,直到按下任意键# 关闭所有 OpenCV 窗口
cv2.destroyAllWindows()  # 关闭所有由 imshow 函数创建的窗口

在这里插入图片描述

4.1 方框滤波

# 方框滤波
# 基本和均值一样,可以选择归一化
# 对图像应用方盒滤波
# cv2.boxFilter() 函数用于对图像进行均值滤波,方盒滤波是均值滤波的一种特殊形式# img 是输入的图像,通常为彩色或灰度图像
# -1 表示输出图像与输入图像具有相同的深度(即数据类型)
# (3, 3) 是滤波器的内核大小,即 3x3 的方形内核
# normalize=True 表示内核的系数会被归一化,使得内核的所有元素之和为 1,这样滤波操作不会改变图像的亮度# 将方盒滤波应用于图像,进行平滑处理
box = cv2.boxFilter(img, -1, (3, 3), normalize=True)cv2.imshow('box', box)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 方框滤波
# 基本和均值一样,可以选择归一化,容易越界
box = cv2.boxFilter(img,-1,(3,3), normalize=False)  cv2.imshow('box', box)
cv2.waitKey(0)
cv2.destroyAllWindows()

4.2 均值滤波

# 均值滤波
# 简单的平均卷积操作
import cv2  # 导入 OpenCV 库# 将 BGR 图像转换为 HSV 色彩空间
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)  # 使用 cvtColor 函数将 BGR 图像转换为 HSV 图像
# HSV 色彩空间包含色调(H)、饱和度(S)和明度(V)三个通道# 显示转换后的 HSV 图像
cv2.imshow("hsv", hsv)  # 使用 imshow 函数显示图像,窗口标题为 "hsv"# 等待用户按键
cv2.waitKey(0)  # 等待用户按键,无参数表示无限等待,直到按下任意键# 关闭所有 OpenCV 窗口
cv2.destroyAllWindows()  # 关闭所有由 imshow 函数创建的窗口

4.3 高斯滤波

# 高斯滤波
# 高斯模糊的卷积核里的数值是满足高斯分布,相当于更重视中间的
# 对图像应用高斯模糊
# cv2.GaussianBlur() 函数用于对图像进行高斯模糊,以平滑图像并减少噪声# img 是输入的图像,通常为彩色或灰度图像
# (5, 5) 是高斯内核的大小,即内核的宽度和高度为 5x5
# 内核的尺寸决定了模糊的程度,尺寸越大,模糊效果越强
# 1 是高斯内核在 x 轴方向的标准差 (sigmaX),控制模糊的范围和强度
# 对于高斯模糊,标准差越大,模糊效果越显著# 将高斯模糊应用于图像,进行平滑处理
gaussian = cv2.GaussianBlur(img, (5, 5), 1)cv2.imshow('aussian', aussian)
cv2.waitKey(0)
cv2.destroyAllWindows()

4.4 中值滤波

# 中值滤波
# 相当于用中值代替
# 对图像应用中值滤波
# cv2.medianBlur() 函数用于对图像进行中值滤波,中值滤波是一种有效的去噪方法# img 是输入图像,通常为彩色或灰度图像
# 5 是滤波器的内核大小,即窗口的尺寸为 5x5
# 内核的大小必须是奇数,并且表示在应用滤波时考虑的像素区域的大小
# 中值滤波会在这个区域内对每个像素进行处理,将该区域内所有像素的中值作为当前像素的值
# 这种方法特别适用于去除椒盐噪声(salt-and-pepper noise)# 将中值滤波应用于图像,进行噪声去除
median = cv2.medianBlur(img, 5)cv2.imshow('median', median)
cv2.waitKey(0)
cv2.destroyAllWindows()

4.5 图像展示

# 展示所有的
res = np.hstack((blur,aussian,median))
#print (res)
cv2.imshow('median vs average', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com