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()