1.安装Opencv
pip install opencv-python
2.读取图像
3.写图像
4. 显示图像
5.waitKey()
6.读视频并播放视频
7.写视频
8. 获取摄像头视频
9.色彩转换
# BGR to GRAY
imgGRAY = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# BGR to RGB
imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# BGR to HSV
imgHSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# BGR to YCrCb (also known as YCC)
imgYCrCb = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb)
10.图像变换
cv2.resize()
函数名称:cv2.resize
函数参数讲解:
src
: 输入图像。dsize
: 输出图像的大小。可以是(width, height)
的元组形式。如果设置为(0, 0)
,则必须提供fx
和fy
。fx
: 沿着 x 轴(水平方向)的缩放因子。当dsize
设置为(0, 0)
时有效。fy
: 沿着 y 轴(垂直方向)的缩放因子。当dsize
设置为(0, 0)
时有效。interpolation
: 插值方法。常用的有cv2.INTER_AREA
(用于缩小)、cv2.INTER_CUBIC
(用于放大,较慢但效果好)、cv2.INTER_LINEAR
(默认,适用于所有情况)。
示例代码:
import cv2# 加载图像
img = cv2.imread('image.jpg')# 缩放到指定大小
resized_img = cv2.resize(img, (800, 600), interpolation=cv2.INTER_LINEAR)# 按比例缩放
scaled_img = cv2.resize(img, (0, 0), fx=0.5, fy=0.5, interpolation=cv2.INTER_LINEAR)
cv2.flip()
函数名称:cv2.flip
函数参数讲解:
src
: 输入图像。flipCode
: 翻转方向标志。0
表示沿 x 轴翻转(上下翻转),1
表示沿 y 轴翻转(左右翻转),-1
表示沿 x 轴和 y 轴同时翻转(对角线翻转)。
示例代码:
import cv2# 加载图像
img = cv2.imread('image.jpg')# 上下翻转
flipped_img_vertical = cv2.flip(img, 0)# 左右翻转
flipped_img_horizontal = cv2.flip(img, 1)# 对角线翻转
flipped_img_both = cv2.flip(img, -1)
cv2.warpAffine
平移、缩放、旋转
函数名称:cv2.warpAffine
函数参数讲解:
src
: 输入图像。M
: 2x3 变换矩阵。dsize
: 输出图像的大小(width, height)
。flags
: 插值方法,默认为cv2.INTER_LINEAR
。borderMode
: 边界填充方式,默认为cv2.BORDER_CONSTANT
。borderValue
: 如果边界模式是cv2.BORDER_CONSTANT
,则使用的边界颜色,默认为黑色。
示例代码:
平移变换:
import cv2
import numpy as np# 加载图像
img = cv2.imread('image.jpg')# 定义平移矩阵
tx, ty = 100, 50 # x轴和y轴上的平移量
M_translation = np.float32([[1, 0, tx], [0, 1, ty]])# 应用平移
translated_img = cv2.warpAffine(img, M_translation, (img.shape[1], img.shape[0]))
缩放变换:
# 定义缩放矩阵
fx, fy = 0.5, 0.5 # 缩放比例
M_scaling = np.float32([[fx, 0, 0], [0, fy, 0]])# 应用缩放
scaled_img = cv2.warpAffine(img, M_scaling, (int(w * fx), int(h * fy)))
旋转变换:
# 获取图像中心点
(h, w) = img.shape[:2]
center = (w // 2, h // 2)# 定义旋转矩阵
angle = 45 # 旋转角度
scale = 1.0 # 缩放比例
M_rotation = cv2.getRotationMatrix2D(center, angle, scale)# 应用旋转
rotated_img = cv2.warpAffine(img, M_rotation, (w, h))
三点仿射变换
函数名称:cv2.getAffineTransform
函数参数讲解:
pts1
: 输入图像中的三个点坐标。pts2
: 输出图像中对应的三个点坐标。
示例代码:
import cv2
import numpy as np# 加载图像
img = cv2.imread('image.jpg')# 定义输入和输出图像中的三个点
pts1 = np.float32([[50, 50], [200, 50], [50, 200]])
pts2 = np.float32([[10, 100], [200, 50], [100, 250]])# 计算仿射变换矩阵
M_affine = cv2.getAffineTransform(pts1, pts2)# 应用仿射变换
affine_transformed_img = cv2.warpAffine(img, M_affine, (img.shape[1], img.shape[0]))
透视变换
函数名称:cv2.getPerspectiveTransform
函数参数讲解:
src
: 输入图像中的四个点坐标。dst
: 输出图像中对应的四个点坐标。
示例代码:
import cv2
import numpy as np# 加载图像
img = cv2.imread('image.jpg')# 定义输入和输出图像中的四个点
pts_src = np.float32([[56, 65], [368, 52], [28, 387], [389, 390]])
pts_dst = np.float32([[0, 0], [300, 0], [0, 300], [300, 300]])# 计算透视变换矩阵
M_perspective = cv2.getPerspectiveTransform(pts_src, pts_dst)# 应用透视变换
perspective_transformed_img = cv2.warpPerspective(img, M_perspective, (300, 300))
11.图像平滑滤波
cv2.blur()
函数名称:cv2.blur
操作介绍:
均值滤波(Mean Filtering)是一种简单的线性滤波器,它通过计算图像中每个像素邻域的平均值来平滑图像。这种滤波方法有助于减少图像中的高斯噪声,但可能会导致边缘模糊。均值滤波总是进行归一化处理,即每个像素的贡献是相等的。
函数参数介绍:
src
: 输入图像。ksize
: 均值滤波器的尺寸(width, height)
。通常是一个奇数的正方形,例如(3, 3)
或(5, 5)
。anchor
: 锚点,默认是中心点(-1, -1)
,表示内核的中心作为锚点。可以指定其他位置来改变滤波器的行为。borderType
: 边界填充方式,如cv2.BORDER_DEFAULT
。
代码示例:
import cv2# 加载图像
img = cv2.imread('image.jpg')# 应用均值滤波
mean_filtered_img = cv2.blur(img, (5, 5))# 显示结果
cv2.imshow('Mean Filtered Image', mean_filtered_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.boxFilter()
函数名称:cv2.boxFilter
操作介绍:
方框滤波(Box Filter)也是一种简单的线性滤波器,它通过计算图像中每个像素邻域的平均值来平滑图像。与均值滤波不同的是,方框滤波允许在计算平均值时考虑边界外的像素,这可以通过设置参数来控制。方框滤波对于减少噪声和模糊化图像非常有用。
函数参数介绍:
src
: 输入图像。ddepth
: 输出图像的深度。如果为-1
,则输出图像将具有与输入图像相同的深度。ksize
: 方框滤波器的尺寸(width, height)
。通常是一个奇数的正方形,例如(3, 3)
或(5, 5)
。normalize
: 如果为True
,则滤波器会进行归一化,即除以核大小的面积;如果为False
,则不会进行归一化,这相当于对每个像素应用了一个常量加权。anchor
: 锚点,默认是中心点(-1, -1)
,表示内核的中心作为锚点。可以指定其他位置来改变滤波器的行为。borderType
: 边界填充方式,如cv2.BORDER_DEFAULT
。
代码示例:
import cv2# 加载图像
img = cv2.imread('image.jpg')# 应用方框滤波
box_filtered_img = cv2.boxFilter(img, -1, (5, 5), normalize=True)# 显示结果
cv2.imshow('Box Filtered Image', box_filtered_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.GaussianBlur()
函数名称:cv2.GaussianBlur
操作介绍:
高斯滤波(Gaussian Filtering)是一种非均匀的线性滤波器,它使用高斯分布作为权重对邻域内的像素进行加权平均。高斯滤波在去除高斯噪声方面效果很好,同时尽量保留图像的边缘信息。高斯滤波器的权重取决于距离中心像素的距离,离得越近的像素权重越大,离得远的像素权重越小。
函数参数介绍:
src
: 输入图像。ksize
: 高斯滤波器的尺寸(width, height)
。通常是一个奇数的正方形,例如(3, 3)
或(5, 5)
。如果设置为(0, 0)
,则根据sigmaX
自动确定。sigmaX
: 沿 X 轴方向的标准差。如果设置为 0,则从ksize
计算得出。sigmaY
: 沿 Y 轴方向的标准差。如果设置为 0,则等于sigmaX
。borderType
: 边界填充方式,如cv2.BORDER_DEFAULT
。
代码示例:
import cv2# 加载图像
img = cv2.imread('image.jpg')# 应用高斯滤波
gaussian_blurred_img = cv2.GaussianBlur(img, (5, 5), 0)# 显示结果
cv2.imshow('Gaussian Blurred Image', gaussian_blurred_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.medianBlur()
函数名称:cv2.medianBlur
操作介绍:
中值滤波(Median Filtering)是一种非线性滤波器,它通过替换每个像素值为其邻域内的中值来平滑图像。中值滤波对于去除椒盐噪声特别有效,因为它能够很好地保护图像的边缘和细节,而不会像均值或高斯滤波那样导致边缘模糊。
函数参数介绍:
src
: 输入图像。ksize
: 中值滤波器的尺寸,必须是大于1的奇数,如3
,5
等。
代码示例:
import cv2# 加载图像
img = cv2.imread('image.jpg')# 应用中值滤波
median_filtered_img = cv2.medianBlur(img, 5)# 显示结果
cv2.imshow('Median Filtered Image', median_filtered_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.bilateralFilter()
函数名称:cv2.bilateralFilter
操作介绍:
双边滤波(Bilateral Filtering)是一种高级的非线性滤波器,它不仅考虑了空间邻近度(即像素之间的距离),还考虑了像素强度差异(即颜色或灰度值)。因此,双边滤波能够在保持边缘的同时有效地减少噪声。它适用于需要保持图像特征的场景,如图像增强、卡通效果生成等。
函数参数介绍:
src
: 输入图像。d
: 每个像素领域直径,如果为非正值,则从sigmaSpace
计算。sigmaColor
: 颜色空间的标准差,较大的值意味着更远的颜色也会被混合到一起,产生更大的半相等颜色区域。sigmaSpace
: 坐标空间的标准差(以像素为单位),较大的值意味着更远的像素也会被混合到一起,只要它们的颜色足够接近。如果d > 0
,它指定了邻域大小且不需要使用sigmaSpace
。
代码示例:
import cv2# 加载图像
img = cv2.imread('image.jpg')# 应用双边滤波
bilateral_filtered_img = cv2.bilateralFilter(img, 9, 75, 75)# 显示结果
cv2.imshow('Bilateral Filtered Image', bilateral_filtered_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.filter2D()
函数名称:cv2.filter2D
操作介绍:
2D卷积滤波(2D Convolution Filtering)是一种通用的滤波方法,它允许用户定义自定义的卷积核(kernel)来对图像进行滤波。卷积核可以是任何大小的矩阵,并且可以根据特定的应用需求设计。2D卷积滤波广泛应用于各种图像处理任务,如边缘检测、锐化、模糊等。
函数参数介绍:
src
: 输入图像。ddepth
: 输出图像的深度。如果为-1
,则输出图像将具有与输入图像相同的深度。kernel
: 卷积核(滤波器),一个二维数组。anchor
: 锚点,默认是中心点(-1, -1)
,表示内核的中心作为锚点。可以指定其他位置来改变滤波器的行为。delta
: 可选偏移量,添加到滤波后的图像上,默认为0
。borderType
: 边界填充方式,如cv2.BORDER_DEFAULT
。
代码示例:
import cv2
import numpy as np# 加载图像
img = cv2.imread('image.jpg')# 定义自定义卷积核
kernel = np.ones((5, 5), np.float32) / 25# 应用2D卷积滤波
convoluted_img = cv2.filter2D(img, -1, kernel)# 显示结果
cv2.imshow('2D Convolved Image', convoluted_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
12.阈值处理
cv2.threshold()
函数名称:cv2.threshold
操作介绍:
全局阈值处理是一种将图像转换为二值图像的简单方法,它根据一个全局阈值来决定每个像素是属于前景(白色)还是背景(黑色)。OpenCV提供了多种全局阈值处理的方法,包括二值化、反二值化、截断、超阈值和低阈值处理。这些方法适用于不同的应用场景,如文档扫描、字符识别等。
函数参数介绍:
src
: 输入图像,通常是一个灰度图像。thresh
: 阈值,用于比较图像中的像素值。maxval
: 当像素值超过(或在某些情况下低于)阈值时应用的最大值。type
: 阈值处理类型,可以是以下之一:cv2.THRESH_BINARY
: 二值化阈值处理,如果像素值大于阈值,则设为maxval
,否则设为0
。cv2.THRESH_BINARY_INV
: 反二值化阈值处理,如果像素值大于阈值,则设为0
,否则设为 maxval。cv2.THRESH_TRUNC
: 截断阈值处理,如果像素值大于阈值,则设为阈值,否则保持不变。cv2.THRESH_TOZERO
: 超阈值处理,如果像素值大于阈值,则设为0
,否则保持不变。cv2.THRESH_TOZERO_INV
: 低阈值处理,如果像素值小于阈值,则设为0
,否则保持不变。
代码示例:
import cv2# 加载图像并转换为灰度
img = cv2.imread('image.jpg', 0)# 二值化阈值处理
ret, binary_img = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)# 反二值化阈值处理
ret, binary_inv_img = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV)# 截断阈值处理
ret, trunc_img = cv2.threshold(img, 127, 255, cv2.THRESH_TRUNC)# 超阈值处理
ret, tozero_img = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO)# 低阈值处理
ret, tozero_inv_img = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO_INV)# 显示结果
cv2.imshow('Binary Image', binary_img)
cv2.imshow('Binary Inv Image', binary_inv_img)
cv2.imshow('Trunc Image', trunc_img)
cv2.imshow('ToZero Image', tozero_img)
cv2.imshow('ToZero Inv Image', tozero_inv_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.adaptiveThreshold()
函数名称:cv2.adaptiveThreshold
操作介绍:
自适应阈值处理是一种改进的全局阈值处理方法,它不是使用一个固定的全局阈值,而是根据图像的不同区域动态地调整阈值。这对于光照不均匀或复杂背景的图像非常有用。自适应阈值处理有两种常用的方法:均值法和高斯加权法。
函数参数介绍:
src
: 输入图像,通常是一个灰度图像。maxValue
: 当像素值超过(或在某些情况下低于)计算出的阈值时应用的最大值。adaptiveMethod
: 自适应阈值计算方法,可以是以下之一:cv2.ADAPTIVE_THRESH_MEAN_C
: 使用邻域内像素的平均值作为阈值。cv2.ADAPTIVE_THRESH_GAUSSIAN_C
: 使用邻域内像素的加权和(高斯窗口)作为阈值。
thresholdType
: 阈值处理类型,通常是cv2.THRESH_BINARY
或cv2.THRESH_BINARY_INV
。blockSize
: 邻域大小(奇数),用于计算阈值。C
: 从计算出的平均值或加权和中减去的常数。
代码示例:
import cv2# 加载图像并转换为灰度
img = cv2.imread('image.jpg', 0)# 自适应阈值处理(均值法)
adaptive_mean_img = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)# 自适应阈值处理(高斯加权法)
adaptive_gaussian_img = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)# 显示结果
cv2.imshow('Adaptive Mean Image', adaptive_mean_img)
cv2.imshow('Adaptive Gaussian Image', adaptive_gaussian_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
迭代阈值处理(Otsu's Binarization)
函数名称:cv2.threshold
with cv2.THRESH_OTSU
操作介绍:
迭代阈值处理,特别是大津法(Otsu's Method),是一种自动确定最佳阈值的方法。它通过最大化类间方差来找到最佳的二值化阈值,特别适合于双峰直方图的图像。大津法可以在 cv2.threshold
函数中通过添加 cv2.THRESH_OTSU
标志来实现。
函数参数介绍:
src
: 输入图像,通常是一个灰度图像。thresh
: 初始阈值,当使用cv2.THRESH_OTSU
时,这个值会被忽略。maxval
: 当像素值超过(或在某些情况下低于)阈值时应用的最大值。type
: 阈值处理类型,通常是cv2.THRESH_BINARY
或cv2.THRESH_BINARY_INV
,并且需要加上cv2.THRESH_OTSU
。
代码示例:
13.图像边缘检测
cv2.Sobel()
函数名称:cv2.Sobel
操作介绍:
Sobel边缘检测是一种基于一阶导数的梯度算子,用于计算图像中每个像素点的水平和垂直方向上的梯度。Sobel算子通过一个3x3的卷积核来检测图像中的边缘。它对噪声有一定的抑制作用,并且能够突出图像中的高梯度区域,即边缘。Sobel算子可以分别计算X轴和Y轴方向的梯度,也可以同时计算两个方向的梯度。
函数参数介绍:
src
: 输入图像,通常是灰度图像。ddepth
: 输出图像的深度,通常为-1
表示与输入图像相同深度,或使用cv2.CV_16S
等类型以避免溢出。dx
: X轴方向的导数阶数,通常为1
。dy
: Y轴方向的导数阶数,通常为1
。ksize
: Sobel算子的尺寸,必须是1
,3
,5
或7
。默认为3
。scale
: 可选比例因子,默认为1
。delta
: 可选偏移量,默认为0
。borderType
: 边界填充方式,如cv2.BORDER_DEFAULT
。
代码示例:
import cv2
import numpy as np# 加载图像并转换为灰度
img = cv2.imread('image.jpg', 0)# 应用Sobel算子(X轴方向)
sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3)
sobelx = np.uint8(np.absolute(sobelx))# 应用Sobel算子(Y轴方向)
sobely = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3)
sobely = np.uint8(np.absolute(sobely))# 合并X轴和Y轴方向的梯度
sobel_combined = cv2.addWeighted(sobelx, 0.5, sobely, 0.5, 0)# 显示结果
cv2.imshow('Sobel X', sobelx)
cv2.imshow('Sobel Y', sobely)
cv2.imshow('Sobel Combined', sobel_combined)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.Laplacian()
函数名称:cv2.Laplacian
操作介绍:
拉普拉斯边缘检测是一种基于二阶导数的梯度算子,用于检测图像中的边缘。拉普拉斯算子通过一个3x3的卷积核来计算图像中每个像素点的二阶导数。它对图像中的局部变化非常敏感,可以检测到图像中的细小边缘和细节。然而,拉普拉斯算子对噪声也很敏感,因此在应用之前通常需要进行预平滑处理。
函数参数介绍:
src
: 输入图像,通常是灰度图像。ddepth
: 输出图像的深度,通常为-1
表示与输入图像相同深度,或使用cv2.CV_16S
等类型以避免溢出。ksize
: 拉普拉斯算子的尺寸,必须是1
,3
,5
或7
。默认为1
。scale
: 可选比例因子,默认为1
。delta
: 可选偏移量,默认为0
。borderType
: 边界填充方式,如cv2.BORDER_DEFAULT
。
代码示例:
import cv2
import numpy as np# 加载图像并转换为灰度
img = cv2.imread('image.jpg', 0)# 应用拉普拉斯算子
laplacian = cv2.Laplacian(img, cv2.CV_64F)
laplacian = np.uint8(np.absolute(laplacian))# 显示结果
cv2.imshow('Laplacian', laplacian)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.Canny()
函数名称:cv2.Canny
操作介绍:
Canny边缘检测是一种多阶段的边缘检测算法,广泛认为是最有效的边缘检测方法之一。Canny算法包括以下几个步骤:
- 高斯滤波: 用于减少图像中的噪声。
- 计算梯度强度和方向: 使用Sobel算子或其他梯度算子计算图像中每个像素点的梯度强度和方向。
- 非极大值抑制: 保留沿边缘方向的最大梯度值,抑制其他非最大值。
- 双阈值处理: 使用高低两个阈值来确定哪些边缘像素是强边缘,哪些是弱边缘。
- 边缘跟踪: 通过连接强边缘和相邻的弱边缘来形成完整的边缘。
Canny边缘检测能够在保持低错误率的同时检测到真实的边缘,因此在许多计算机视觉任务中非常有用。
函数参数介绍:
src
: 输入图像,通常是灰度图像。threshold1
: 第一个阈值,用于双阈值处理中的低阈值。threshold2
: 第二个阈值,用于双阈值处理中的高阈值。apertureSize
: Sobel算子的孔径大小,默认为3
。L2gradient
: 如果为True
,则使用更精确的 L2 范数来计算梯度幅值;如果为False
,则使用更快但稍微不准确的 L1 范数。
代码示例:
import cv2# 加载图像并转换为灰度
img = cv2.imread('image.jpg', 0)# 应用Canny边缘检测
edges = cv2.Canny(img, 100, 200)# 显示结果
cv2.imshow('Canny Edges', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()
14.Opencv的图像特征提取
纹理特征:LBP(局部二值模式)
形状特征:HOG(方向梯度直方图),SIFT(尺度不变特征变换)