OpenCV `cv2` 模块:高级图像处理与计算机视觉算法实现

好的,各位观众,欢迎来到今天的“OpenCV cv2 模块:高级图像处理与计算机视觉算法实现”讲座!今天咱们不讲虚的,直接上干货,用代码说话,保证让大家听得懂,学得会,还能乐得开怀。

首先,咱们得明确一个概念,cv2 模块是 OpenCV 库在 Python 中的接口,它就像一个神通广大的工具箱,里面装满了各种图像处理和计算机视觉的利器。

第一部分:图像基础操作,让图片“听话”

图像处理,顾名思义,就是对图像进行各种操作,让它变得更符合我们的需求。这就像给图片“化妆”,让它更漂亮,或者让它更“懂事”,能告诉我们更多信息。

  1. 读取和显示图像:你好,世界!

    这是任何图像处理的起点,就像编程界的“Hello, World!”。

    import cv2
    
    # 读取图像
    img = cv2.imread('your_image.jpg')  # 替换为你的图像路径
    
    # 检查图像是否成功加载
    if img is None:
       print("Error: Could not load image.")
    else:
       # 显示图像
       cv2.imshow('Image', img)
       cv2.waitKey(0)  # 等待键盘按下任意键
       cv2.destroyAllWindows() # 关闭所有窗口

    这段代码很简单,cv2.imread() 函数负责读取图像,cv2.imshow() 函数负责显示图像。cv2.waitKey(0) 确保图像窗口不会一闪而过,而是会一直显示,直到你按下键盘上的任意键。cv2.destroyAllWindows() 会关闭所有打开的窗口,释放资源。

    注意事项:

    • 确保你的图像文件存在,并且路径正确。
    • OpenCV 默认读取的图像颜色通道顺序是 BGR(蓝绿红),而不是 RGB(红绿蓝)。如果你需要将其转换为 RGB,可以使用 cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
  2. 图像色彩空间转换:变色龙的秘密

    图像的色彩空间有很多种,比如 RGB、HSV、GRAY 等。不同的色彩空间在不同的应用场景下有不同的优势。

    • RGB (Red, Green, Blue): 最常见的色彩空间,用红、绿、蓝三个分量表示颜色。
    • HSV (Hue, Saturation, Value): 更符合人类视觉感知的色彩空间,用色调、饱和度、亮度三个分量表示颜色。
    • GRAY: 灰度图像,只有一个亮度分量,常用于图像预处理。
    import cv2
    
    img = cv2.imread('your_image.jpg')
    
    # 转换为灰度图像
    gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    cv2.imshow('Gray Image', gray_img)
    
    # 转换为 HSV 图像
    hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    cv2.imshow('HSV Image', hsv_img)
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    cv2.cvtColor() 函数可以实现色彩空间之间的转换。 cv2.COLOR_BGR2GRAY 表示从 BGR 转换为灰度,cv2.COLOR_BGR2HSV 表示从 BGR 转换为 HSV。

  3. 图像裁剪和缩放:瘦身与拉伸

    裁剪图像可以截取图像的感兴趣区域 (ROI),缩放图像可以改变图像的大小。

    import cv2
    
    img = cv2.imread('your_image.jpg')
    
    # 裁剪图像 (从 (100, 100) 到 (300, 400))
    cropped_img = img[100:400, 100:300]
    cv2.imshow('Cropped Image', cropped_img)
    
    # 缩放图像 (缩放到 500x500 像素)
    resized_img = cv2.resize(img, (500, 500))
    cv2.imshow('Resized Image', resized_img)
    
    # 缩放图像 (使用插值方法,例如双线性插值)
    resized_img_linear = cv2.resize(img, (500, 500), interpolation=cv2.INTER_LINEAR)
    cv2.imshow('Resized Image (Linear)', resized_img_linear)
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    • 图像裁剪使用数组切片的方式,img[y1:y2, x1:x2] 表示截取图像的 (x1, y1) 到 (x2, y2) 区域。
    • cv2.resize() 函数可以缩放图像,第一个参数是图像,第二个参数是目标大小,interpolation 参数指定插值方法。常用的插值方法有:

      • cv2.INTER_LINEAR:双线性插值,速度快,效果较好。
      • cv2.INTER_AREA:区域插值,适用于图像缩小。
      • cv2.INTER_CUBIC:三次样条插值,效果最好,但速度较慢。
      • cv2.INTER_LANCZOS4:Lanczos 插值,效果也比较好,速度较慢。

第二部分:图像滤波,让图片更“光滑”

图像滤波是一种常用的图像处理技术,可以用来去除图像噪声,平滑图像,或者增强图像的某些特征。

  1. 均值滤波:模糊大师

    均值滤波是一种线性滤波器,它用图像中每个像素周围邻域的平均值来代替该像素的值。

    import cv2
    
    img = cv2.imread('your_image.jpg')
    
    # 均值滤波 (使用 5x5 的核)
    blur_img = cv2.blur(img, (5, 5))
    cv2.imshow('Blur Image', blur_img)
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    cv2.blur() 函数可以实现均值滤波,第二个参数是核的大小,表示邻域的大小。核越大,图像越模糊。

  2. 高斯滤波:柔和的模糊

    高斯滤波也是一种线性滤波器,它使用高斯函数作为权重来计算邻域的平均值。高斯滤波比均值滤波更柔和,更能保留图像的细节。

    import cv2
    
    img = cv2.imread('your_image.jpg')
    
    # 高斯滤波 (使用 5x5 的核,标准差为 0)
    gaussian_img = cv2.GaussianBlur(img, (5, 5), 0)
    cv2.imshow('Gaussian Image', gaussian_img)
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    cv2.GaussianBlur() 函数可以实现高斯滤波,第三个参数是标准差,表示高斯函数的宽度。标准差越大,图像越模糊。如果标准差为 0,则 OpenCV 会自动计算标准差。

  3. 中值滤波:噪声克星

    中值滤波是一种非线性滤波器,它用图像中每个像素周围邻域的中值来代替该像素的值。中值滤波对椒盐噪声 (salt and pepper noise) 有很好的去除效果。

    import cv2
    
    img = cv2.imread('your_image.jpg')
    
    # 中值滤波 (使用 5x5 的核)
    median_img = cv2.medianBlur(img, 5)
    cv2.imshow('Median Image', median_img)
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    cv2.medianBlur() 函数可以实现中值滤波,第二个参数是核的大小,必须是奇数。

  4. 双边滤波:磨皮神器

    双边滤波是一种非线性滤波器,它在考虑像素空间距离的同时,也考虑像素值之间的差异。双边滤波可以在去除噪声的同时,保留图像的边缘信息。

    import cv2
    
    img = cv2.imread('your_image.jpg')
    
    # 双边滤波 (参数分别为:图像,邻域直径,颜色标准差,空间标准差)
    bilateral_img = cv2.bilateralFilter(img, 9, 75, 75)
    cv2.imshow('Bilateral Image', bilateral_img)
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    cv2.bilateralFilter() 函数可以实现双边滤波。参数说明:

    • d: 邻域直径。
    • sigmaColor: 颜色标准差,用于控制颜色相似度。
    • sigmaSpace: 空间标准差,用于控制空间距离。

    双边滤波的参数需要仔细调整,才能达到最佳效果。

第三部分:边缘检测,让轮廓显现

边缘是图像中像素值发生剧烈变化的地方,边缘检测可以用来提取图像的轮廓信息。

  1. Sobel 算子:梯度显形记

    Sobel 算子是一种基于图像梯度的一阶微分算子,可以用来检测图像的水平和垂直边缘。

    import cv2
    
    img = cv2.imread('your_image.jpg', cv2.IMREAD_GRAYSCALE) # 灰度图像
    
    # Sobel 算子 (计算水平方向的梯度)
    sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3)
    
    # Sobel 算子 (计算垂直方向的梯度)
    sobely = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3)
    
    # 将梯度值转换为绝对值,并转换为 8 位无符号整数
    abs_sobelx = cv2.convertScaleAbs(sobelx)
    abs_sobely = cv2.convertScaleAbs(sobely)
    
    # 合并水平和垂直方向的梯度
    sobelxy = cv2.addWeighted(abs_sobelx, 0.5, abs_sobely, 0.5, 0)
    
    cv2.imshow('Sobel X', abs_sobelx)
    cv2.imshow('Sobel Y', abs_sobely)
    cv2.imshow('Sobel XY', sobelxy)
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    • cv2.Sobel() 函数可以实现 Sobel 算子。

      • 第一个参数是输入图像,必须是灰度图像。
      • 第二个参数是输出图像的数据类型,cv2.CV_64F 表示 64 位浮点数,可以表示负数和更精确的梯度值。
      • 第三个参数是 x 方向的导数阶数,1 表示计算 x 方向的一阶导数。
      • 第四个参数是 y 方向的导数阶数,0 表示不计算 y 方向的导数。
      • ksize 参数是 Sobel 算子的核的大小,必须是奇数。
    • 由于 Sobel 算子计算的梯度值可能为负数,所以需要使用 cv2.convertScaleAbs() 函数将其转换为绝对值,并转换为 8 位无符号整数,才能正常显示。

    • cv2.addWeighted() 函数可以合并两个图像,alphabeta 参数分别是两个图像的权重,gamma 参数是添加到结果上的一个标量。

  2. Laplacian 算子:二阶导的魅力

    Laplacian 算子是一种基于图像梯度的二阶微分算子,对噪声比较敏感。

    import cv2
    
    img = cv2.imread('your_image.jpg', cv2.IMREAD_GRAYSCALE)
    
    # Laplacian 算子
    laplacian = cv2.Laplacian(img, cv2.CV_64F)
    
    # 将梯度值转换为绝对值,并转换为 8 位无符号整数
    abs_laplacian = cv2.convertScaleAbs(laplacian)
    
    cv2.imshow('Laplacian', abs_laplacian)
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    cv2.Laplacian() 函数可以实现 Laplacian 算子。

  3. Canny 边缘检测:边缘检测的王者

    Canny 边缘检测是一种多阶段的边缘检测算法,它包括以下步骤:

    1. 高斯滤波:去除图像噪声。
    2. 计算梯度:使用 Sobel 算子计算图像的梯度。
    3. 非极大值抑制:去除梯度方向上的非极大值。
    4. 双阈值检测:使用两个阈值来区分边缘像素和非边缘像素。
    5. 边缘连接:将边缘像素连接成完整的边缘。

    Canny 边缘检测是目前最常用的边缘检测算法之一。

    import cv2
    
    img = cv2.imread('your_image.jpg', cv2.IMREAD_GRAYSCALE)
    
    # Canny 边缘检测 (参数分别为:图像,低阈值,高阈值)
    canny = cv2.Canny(img, 50, 150)
    
    cv2.imshow('Canny', canny)
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    cv2.Canny() 函数可以实现 Canny 边缘检测。threshold1 是低阈值,threshold2 是高阈值。建议高阈值是低阈值的2-3倍。

第四部分:图像形态学操作,让图像“变形”

图像形态学操作是一种基于形状的图像处理技术,可以用来去除图像噪声,连接断裂的边缘,或者填充图像中的空洞。

  1. 腐蚀:蚕食边缘

    腐蚀操作可以去除图像边缘的像素,使图像中的物体变小。

    import cv2
    import numpy as np
    
    img = cv2.imread('your_image.jpg', cv2.IMREAD_GRAYSCALE)
    
    # 定义一个 5x5 的矩形结构元素
    kernel = np.ones((5, 5), np.uint8)
    
    # 腐蚀操作
    erosion = cv2.erode(img, kernel, iterations=1)
    
    cv2.imshow('Erosion', erosion)
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    cv2.erode() 函数可以实现腐蚀操作。

    • 第一个参数是输入图像,必须是灰度图像。
    • 第二个参数是结构元素,用来定义腐蚀的形状和大小。
    • iterations 参数是腐蚀的次数。
  2. 膨胀:扩张领土

    膨胀操作可以增加图像边缘的像素,使图像中的物体变大。

    import cv2
    import numpy as np
    
    img = cv2.imread('your_image.jpg', cv2.IMREAD_GRAYSCALE)
    
    # 定义一个 5x5 的矩形结构元素
    kernel = np.ones((5, 5), np.uint8)
    
    # 膨胀操作
    dilation = cv2.dilate(img, kernel, iterations=1)
    
    cv2.imshow('Dilation', dilation)
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    cv2.dilate() 函数可以实现膨胀操作。

  3. 开运算:先腐蚀后膨胀

    开运算可以去除图像中的小噪声,连接断裂的边缘,并平滑图像的轮廓。

    import cv2
    import numpy as np
    
    img = cv2.imread('your_image.jpg', cv2.IMREAD_GRAYSCALE)
    
    # 定义一个 5x5 的矩形结构元素
    kernel = np.ones((5, 5), np.uint8)
    
    # 开运算
    opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
    
    cv2.imshow('Opening', opening)
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    cv2.morphologyEx() 函数可以实现各种形态学操作。cv2.MORPH_OPEN 表示开运算。

  4. 闭运算:先膨胀后腐蚀

    闭运算可以填充图像中的小空洞,连接相邻的物体,并平滑图像的轮廓。

    import cv2
    import numpy as np
    
    img = cv2.imread('your_image.jpg', cv2.IMREAD_GRAYSCALE)
    
    # 定义一个 5x5 的矩形结构元素
    kernel = np.ones((5, 5), np.uint8)
    
    # 闭运算
    closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
    
    cv2.imshow('Closing', closing)
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    cv2.morphologyEx() 函数可以实现各种形态学操作。cv2.MORPH_CLOSE 表示闭运算。

第五部分:图像分割,化整为零

图像分割是将图像分成多个区域的过程,每个区域都具有相似的特征。图像分割是计算机视觉中的一个重要任务,可以用于目标检测、图像识别等应用。

  1. 阈值分割:简单粗暴

    阈值分割是一种最简单的图像分割方法,它根据像素值的大小将图像分成两个区域。

    import cv2
    
    img = cv2.imread('your_image.jpg', cv2.IMREAD_GRAYSCALE)
    
    # 阈值分割 (大于 127 的像素设置为 255,小于等于 127 的像素设置为 0)
    ret, thresh = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
    
    cv2.imshow('Threshold', thresh)
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    cv2.threshold() 函数可以实现阈值分割。

    • thresh 是分割后的图像。
    • ret 是阈值。
    • cv2.THRESH_BINARY 表示二进制阈值分割,大于阈值的像素设置为最大值,小于等于阈值的像素设置为 0。
    • cv2.THRESH_BINARY_INV 表示反二进制阈值分割,大于阈值的像素设置为 0,小于等于阈值的像素设置为最大值。
    • cv2.THRESH_TRUNC 表示截断阈值分割,大于阈值的像素设置为阈值,小于等于阈值的像素保持不变。
    • cv2.THRESH_TOZERO 表示置零阈值分割,大于阈值的像素保持不变,小于等于阈值的像素设置为 0。
    • cv2.THRESH_TOZERO_INV 表示反置零阈值分割,大于阈值的像素设置为 0,小于等于阈值的像素保持不变。
  2. 自适应阈值分割:因地制宜

    自适应阈值分割可以根据图像的局部特征自动选择阈值,适用于光照不均匀的图像。

    import cv2
    
    img = cv2.imread('your_image.jpg', cv2.IMREAD_GRAYSCALE)
    
    # 自适应阈值分割 (使用高斯加权平均)
    thresh = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
    
    cv2.imshow('Adaptive Threshold', thresh)
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    cv2.adaptiveThreshold() 函数可以实现自适应阈值分割。

    • cv2.ADAPTIVE_THRESH_MEAN_C 表示使用邻域的平均值作为阈值。
    • cv2.ADAPTIVE_THRESH_GAUSSIAN_C 表示使用邻域的高斯加权平均值作为阈值。
    • blockSize 参数是邻域的大小。
    • C 参数是从平均值或加权平均值中减去的常数。
  3. K-means 聚类:抱团取暖

    K-means 聚类是一种常用的无监督学习算法,可以将图像中的像素分成 K 个簇,每个簇的像素具有相似的颜色或灰度值。

    import cv2
    import numpy as np
    
    img = cv2.imread('your_image.jpg')
    
    # 将图像转换为一维数组
    pixels = img.reshape((-1, 3))
    pixels = np.float32(pixels)
    
    # 定义 K-means 聚类的参数
    criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 100, 0.2)
    K = 3
    
    # K-means 聚类
    ret, labels, centers = cv2.kmeans(pixels, K, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS)
    
    # 将聚类结果转换为图像
    centers = np.uint8(centers)
    segmented_data = centers[labels.flatten()]
    segmented_image = segmented_data.reshape(img.shape)
    
    cv2.imshow('Segmented Image', segmented_image)
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    • cv2.kmeans() 函数可以实现 K-means 聚类。
      • 第一个参数是输入数据,必须是 np.float32 类型。
      • 第二个参数是簇的数量。
      • 第三个参数是最佳标签,可以设置为 None
      • 第四个参数是终止条件。
        • cv2.TERM_CRITERIA_EPS 表示当聚类中心的移动距离小于某个值时,停止聚类。
        • cv2.TERM_CRITERIA_MAX_ITER 表示当聚类迭代次数达到最大值时,停止聚类。
      • 第五个参数是尝试不同的初始标签的次数。
      • 第六个参数是初始聚类中心的选择方法。
        • cv2.KMEANS_RANDOM_CENTERS 表示随机选择初始聚类中心。
        • cv2.KMEANS_PP_CENTERS 表示使用 K-means++ 算法选择初始聚类中心。

第六部分:目标检测,火眼金睛

目标检测是指在图像中识别和定位特定物体的过程。

  1. Haar 特征 + AdaBoost:古老的智慧

    Haar 特征是一种简单的图像特征,可以用来描述图像中的边缘、线段和中心点等结构。AdaBoost 是一种机器学习算法,可以用来训练分类器,将 Haar 特征组合成一个强分类器。

    OpenCV 提供了预训练的 Haar 分类器,可以用来检测人脸、眼睛等物体。

    import cv2
    
    # 加载人脸检测器
    face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') # 需要下载
    
    img = cv2.imread('your_image.jpg')
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
    # 检测人脸
    faces = face_cascade.detectMultiScale(gray, 1.1, 4)
    
    # 在图像中标记人脸
    for (x, y, w, h) in faces:
       cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)
    
    cv2.imshow('Faces detected', img)
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    • cv2.CascadeClassifier() 函数可以加载 Haar 分类器。
    • detectMultiScale() 函数可以检测图像中的物体。
      • 第一个参数是输入图像,必须是灰度图像。
      • scaleFactor 参数是图像缩放比例,用来减少计算量。
      • minNeighbors 参数是每个目标至少需要多少个邻居才能被认为是有效的。
  2. HOG 特征 + SVM:曾经的王者

    HOG (Histogram of Oriented Gradients) 特征是一种用来描述图像局部梯度方向信息的特征。SVM (Support Vector Machine) 是一种机器学习算法,可以用来训练分类器,将 HOG 特征组合成一个强分类器。

    HOG 特征和 SVM 算法曾经是目标检测领域的主流方法。

  3. 深度学习目标检测算法:未来的方向

随着深度学习的发展,基于卷积神经网络的目标检测算法,如YOLO、SSD、Faster R-CNN等,已经成为目标检测领域的主流方法。这些算法具有更高的精度和更快的速度,但需要大量的训练数据和计算资源。这些算法的使用通常需要用到 dnn 模块。这里不深入介绍,只是提一下方向。

总结

今天我们学习了 OpenCV cv2 模块的一些常用图像处理和计算机视觉算法。希望大家能够掌握这些知识,并将其应用到实际项目中。当然,OpenCV 的功能远不止这些,还有很多更高级的算法等待我们去探索。记住,实践是检验真理的唯一标准,多写代码,多做实验,才能真正掌握 OpenCV!

功能 函数/方法 描述
读取图像 cv2.imread(filename, flags) 读取图像文件。flags 参数指定读取图像的方式,如 cv2.IMREAD_COLOR (默认), cv2.IMREAD_GRAYSCALE, cv2.IMREAD_UNCHANGED
显示图像 cv2.imshow(window_name, image) 在窗口中显示图像。
关闭窗口 cv2.waitKey(delay) 等待键盘按下任意键,或等待指定时间(毫秒)。delay=0 表示无限期等待。
cv2.destroyAllWindows() 关闭所有打开的 OpenCV 窗口。
色彩空间转换 cv2.cvtColor(image, code) 转换图像的色彩空间。code 参数指定转换的方式,如 cv2.COLOR_BGR2GRAY, cv2.COLOR_BGR2HSV, cv2.COLOR_RGB2BGR 等。
缩放图像 cv2.resize(image, dsize[, fx[, fy[, interpolation]]]) 缩放图像。dsize 参数指定目标图像的大小,fxfy 参数指定 x 和 y 方向的缩放比例,interpolation 参数指定插值方法。
图像滤波 cv2.blur(image, ksize) 均值滤波。ksize 参数指定滤波器的大小。
cv2.GaussianBlur(image, ksize, sigmaX[, sigmaY]) 高斯滤波。ksize 参数指定滤波器的大小,sigmaXsigmaY 参数指定 x 和 y 方向的标准差。
cv2.medianBlur(image, ksize) 中值滤波。ksize 参数指定滤波器的大小,必须是奇数。
cv2.bilateralFilter(image, d, sigmaColor, sigmaSpace) 双边滤波。d 参数指定滤波器的直径,sigmaColor 参数指定颜色空间的标准差,sigmaSpace 参数指定坐标空间的标准差。
边缘检测 cv2.Sobel(image, ddepth, dx, dy[, ksize[, scale[, delta[, borderType]]]]]) Sobel 算子。ddepth 参数指定输出图像的深度,dxdy 参数指定 x 和 y 方向的导数阶数,ksize 参数指定 Sobel 算子的大小。
cv2.Laplacian(image, ddepth[, ksize[, scale[, delta[, borderType]]]]]) Laplacian 算子。ddepth 参数指定输出图像的深度,ksize 参数指定 Laplacian 算子的大小。
cv2.Canny(image, threshold1, threshold2[, apertureSize[, L2gradient]]) Canny 边缘检测。threshold1threshold2 参数指定低阈值和高阈值,apertureSize 参数指定 Sobel 算子的大小。
形态学操作 cv2.erode(image, kernel[, anchor[, iterations[, borderType[, borderValue]]]]) 腐蚀操作。kernel 参数指定结构元素,iterations 参数指定腐蚀的次数。
cv2.dilate(image, kernel[, anchor[, iterations[, borderType[, borderValue]]]]) 膨胀操作。kernel 参数指定结构元素,iterations 参数指定膨胀的次数。
cv2.morphologyEx(image, op, kernel[, anchor[, iterations[, borderType[, borderValue]]]]]) 形态学变换。op 参数指定形态学操作的类型,如 cv2.MORPH_OPEN (开运算), cv2.MORPH_CLOSE (闭运算), cv2.MORPH_GRADIENT (形态学梯度), cv2.MORPH_TOPHAT (顶帽变换), cv2.MORPH_BLACKHAT (黑帽变换)。
阈值分割 cv2.threshold(image, thresh, maxval, type) 阈值分割。thresh 参数指定阈值,maxval 参数指定最大值,type 参数指定阈值分割的类型,如 cv2.THRESH_BINARY, cv2.THRESH_BINARY_INV, cv2.THRESH_TRUNC, cv2.THRESH_TOZERO, cv2.THRESH_TOZERO_INV
自适应阈值分割 cv2.adaptiveThreshold(image, maxValue, adaptiveMethod, thresholdType, blockSize, C) 自适应阈值分割。maxValue 参数指定最大值,adaptiveMethod 参数指定自适应方法,如 cv2.ADAPTIVE_THRESH_MEAN_C, cv2.ADAPTIVE_THRESH_GAUSSIAN_CthresholdType 参数指定阈值分割的类型,blockSize 参数指定块大小,C 参数指定常数。
K-means 聚类 cv2.kmeans(data, K, bestLabels, criteria, attempts, flags) K-means 聚类。data 参数指定输入数据,K 参数指定簇的数量,criteria 参数指定终止条件,attempts 参数指定尝试的次数,flags 参数指定初始中心的选择方法。
Haar 特征检测 cv2.CascadeClassifier.detectMultiScale(image[, scaleFactor[, minNeighbors[, flags[, minSize[, maxSize]]]]]) 使用 Haar 分类器检测图像中的物体。scaleFactor 参数指定图像缩放比例,minNeighbors 参数指定每个目标至少需要多少个邻居才能被认为是有效的,minSize 参数指定最小目标大小,maxSize 参数指定最大目标大小。

希望以上内容对您有所帮助! 以后有需要尽管吩咐。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注