欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 会展 > pythonOpenCV篇:0基础带你python入门之常用函数

pythonOpenCV篇:0基础带你python入门之常用函数

2024/12/21 23:56:07 来源:https://blog.csdn.net/qq_63627943/article/details/144407582  浏览:    关键词:pythonOpenCV篇:0基础带你python入门之常用函数

二值化函数

  • 功能:将图像转换为二值图像(黑白图像),将像素值分为两种类别:前景(白)和背景(黑)。
  • 函数cv2.threshold()
  • 参数
    1. src:输入图像(通常为灰度图像)。
    2. thresh:阈值值,用于将像素分割为前景和背景。
    3. maxval:满足条件的像素值赋值为此值(通常为255)。
    4. type:阈值类型,例如:
      • cv2.THRESH_BINARY:大于阈值的像素赋值为maxval,否则为0。
      • cv2.THRESH_BINARY_INV:反向二值化。
      • cv2.THRESH_TRUNC:大于阈值的像素赋值为阈值,其余保持不变。
      • cv2.THRESH_TOZERO:小于阈值的像素赋值为0。
      • cv2.THRESH_TOZERO_INV:大于阈值的像素赋值为0。
  • 返回值
    1. retval:实际使用的阈值(当选择 Otsu 或自适应阈值时有意义)。
    2. dst:二值化后的图像。
  • 应用:目标检测、边缘检测、文档处理等。
  • 代码:
    import cv2# 读取图像文件
    img = cv2.imread("./lena.png")  # 从当前目录读取名为 "lena.png" 的图像文件
    cv2.imshow("flower", img)  # 显示原始图像,窗口标题为 "flower"# 将彩色图像转换为灰度图像
    img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 使用 OpenCV 的颜色转换函数,将图像从 BGR 转为灰度
    cv2.imshow("gray", img_gray)  # 显示灰度图像,窗口标题为 "gray"# 设置二值化的阈值
    thresh = 120  # 阈值设为 120,低于该值的像素归为 0,高于该值的像素归为 255# 手动实现基于阈值的二值化
    img_binary = img_gray  # 将灰度图赋值给新的变量 img_binary
    for i in range(img_gray.shape[0]):  # 遍历图像的每一行for j in range(img_gray.shape[1]):  # 遍历图像的每一列if img_binary[i][j] <= thresh:  # 如果像素值小于等于阈值pass  # 此处原本应该将像素值设为 0,但被注释掉了(什么都不做)# img_binary[i][j] = 0  # 手动将像素值设置为 0else:  # 如果像素值大于阈值img_binary[i][j] = 255  # 手动将像素值设置为 255(白色)# 使用 OpenCV 自带的阈值函数实现二值化(此部分代码被注释掉)
    # ret, img_binary = cv2.threshold(img_gray, 200, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
    # 说明:
    # ret:实际使用的阈值(当使用 Otsu 方法时,自动计算得到)。
    # img_binary:二值化后的图像。
    # cv2.THRESH_BINARY:普通二值化,像素值高于阈值设为最大值(255),否则为 0。
    # cv2.THRESH_OTSU:自动计算全局最佳阈值。# 显示二值化后的图像
    cv2.imshow("threshold ", img_binary)  # 显示手动二值化后的图像,窗口标题为 "threshold"# 等待用户按键,随后关闭窗口
    cv2.waitKey(0)  # 等待用户按下任意键,不限制时间
    


自适应二值化函数

  • 功能:对光照不均匀的图像进行二值化,使用局部区域的统计信息来计算阈值。
  • 函数cv2.adaptiveThreshold()
  • 参数
    1. src:输入图像(必须是灰度图)。
    2. maxValue:满足条件的像素值赋值为此值(通常为255)。
    3. adaptiveMethod:自适应阈值计算方法:
      • cv2.ADAPTIVE_THRESH_MEAN_C:取邻域均值作为阈值。
      • cv2.ADAPTIVE_THRESH_GAUSSIAN_C:取邻域高斯加权均值作为阈值。
    4. thresholdType:阈值类型(通常为 cv2.THRESH_BINARYcv2.THRESH_BINARY_INV)。
    5. blockSize:邻域大小(必须为奇数)。
    6. C:常量,用于调整阈值结果。
  • 返回值
    • dst:自适应二值化后的图像。
  • 应用:场景文字检测、身份证/票据识别、医学影像处理。
  • 代码:
    import cv2  # 导入 OpenCV 库,用于图像处理# 读取图像
    image = cv2.imread("./lena.png")  # 从当前目录读取名为 "lena.png" 的图像文件(彩色图像)
    # cv2.imshow("flower", image)  # 如果需要显示原图,可以取消注释此行,窗口标题为 "flower"# 将彩色图像转换为灰度图像
    img_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)  # 使用 OpenCV 的颜色转换函数,将 BGR 彩色图像转为灰度图像
    cv2.imshow("gray", img_gray)  # 显示灰度图像,窗口标题为 "gray"# 使用 Otsu 方法进行全局阈值化
    ret, img_binary = cv2.threshold(img_gray,          # 输入图像,必须是灰度图像200,               # 手动设置的初始阈值(Otsu 会自动调整,此值会被忽略)255,               # 满足条件的像素值设置为 255cv2.THRESH_BINARY + cv2.THRESH_OTSU  # 二值化模式为 Otsu 和普通二值化的组合
    )
    # cv2.imshow("threshold", img_binary)  # 如果需要显示 Otsu 二值化结果,可以取消注释此行,窗口标题为 "threshold"# 使用自适应二值化方法
    image_np_adaptive = cv2.adaptiveThreshold(img_gray,                  # 输入图像,必须是灰度图像255,                       # 满足条件的像素值设置为 255cv2.ADAPTIVE_THRESH_GAUSSIAN_C,  # 使用高斯加权的邻域均值来计算局部阈值cv2.THRESH_BINARY,         # 二值化模式为普通二值化7,                       # 邻域大小(blockSize),必须为奇数,例如 7 表示 7×7 的窗口5                         # 常量 C,最终阈值为计算出的局部阈值减去 C
    )
    cv2.imshow("image_np_adaptive", image_np_adaptive)  # 显示自适应二值化后的图像,窗口标题为 "image_np_adaptive"# 等待用户按键,随后关闭所有窗口
    cv2.waitKey(0)  # 等待用户按下任意键,不限制时间
    


腐蚀函数

  • 功能:减少图像中的白色区域(前景),去除小的噪声点或断开小的连接。
  • 函数cv2.erode()
  • 参数
    1. src:输入图像(二值图像或灰度图像)。
    2. kernel:结构元素(形状和大小由 cv2.getStructuringElement() 定义)。
    3. iterations:腐蚀操作的次数。
  • 返回值
    • dst:腐蚀后的图像。
  • 应用:去除噪声、边缘提取、分离连通物体等。
  • 代码:
    import cv2  # 导入 OpenCV 库,用于图像处理# 读取图像
    image_binary = cv2.imread("./morph.png")  # 从当前目录读取名为 "morph.png" 的图像文件
    # 注意:这里假设图像是二值图像(黑白图像),如果图像是彩色或灰度图,需要先进行预处理。# 创建结构元素(内核)
    image_1 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,  # 内核形状为椭圆(10, 10)            # 内核大小为 10×10 像素
    )
    # 说明:
    # `cv2.getStructuringElement()` 用于创建形态学操作的结构元素(内核)。
    # 参数 `cv2.MORPH_ELLIPSE` 表示使用椭圆形内核。其他可选形状包括:
    # - `cv2.MORPH_RECT`:矩形
    # - `cv2.MORPH_CROSS`:交叉形
    # 内核的大小对形态学操作的结果影响很大,较大的内核会产生更显著的效果。# 使用腐蚀操作处理图像
    image_erode = cv2.erode(image_binary,  # 输入图像,通常为二值图像image_1        # 结构元素(内核)
    )
    # 说明:
    # `cv2.erode()` 是 OpenCV 的腐蚀函数,用于减少图像中前景(白色区域)的面积。
    # 通过结构元素内核,腐蚀操作会移除边缘上的白色像素。
    # 对于 10×10 的椭圆内核,腐蚀操作会缩小前景区域,并去除小的噪声。# 显示腐蚀后的图像
    cv2.imshow("image_erode", image_erode)  # 显示腐蚀后的图像,窗口标题为 "image_erode"# 显示原始图像
    cv2.imshow("image_binary", image_binary)  # 显示原始图像,窗口标题为 "image_binary"# 等待用户按键后关闭窗口
    cv2.waitKey(0)  # 等待用户按下任意键
    


膨胀函数

  • 功能:增加图像中的白色区域(前景),填补断裂的区域或小孔。
  • 函数cv2.dilate()
  • 参数
    1. src:输入图像(二值图像或灰度图像)。
    2. kernel:结构元素。
    3. iterations:膨胀操作的次数。
  • 返回值
    • dst:膨胀后的图像。
  • 应用:增强物体区域、填充空隙、形态学处理等。
  • 代码:
    import cv2  # 导入 OpenCV 库,用于图像处理# 读取图像
    image_binary = cv2.imread("./lena.png")  # 从当前目录读取名为 "lena.png" 的图像文件(彩色图像)# 将彩色图像转换为灰度图像
    image_gray = cv2.cvtColor(image_binary, cv2.COLOR_BGR2GRAY)  # 使用 OpenCV 的颜色转换函数,将 BGR 图像转为灰度图像# 自适应二值化
    image_np_adaptive = cv2.adaptiveThreshold(image_gray,                # 输入灰度图像255,                       # 满足条件的像素值设置为 255cv2.ADAPTIVE_THRESH_GAUSSIAN_C,  # 使用高斯加权的邻域均值计算局部阈值cv2.THRESH_BINARY,         # 二值化模式为普通二值化7,                         # 邻域大小(blockSize),必须是奇数,这里为 7×7 的窗口5                          # 常量 C,用于调整阈值(阈值 = 局部均值 - C)
    )
    # 自适应二值化适用于光照不均匀的图像处理。参数 `blockSize` 和 `C` 会直接影响二值化结果。# 创建形态学操作的结构元素(内核)
    kernal = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,  # 内核形状为椭圆形(4, 4)              # 内核大小为 4×4 像素
    )
    # 注意:较小的内核会对图像做出细微的形态学改变,较大的内核会显著改变图像形状。# 腐蚀操作
    image_erode = cv2.erode(image_np_adaptive,  # 输入二值图像(经过自适应二值化的图像)kernal              # 使用的内核
    )
    # `cv2.erode()` 会减少前景(白色区域)的面积,移除边缘上的噪声点或小的白色区域。
    # 腐蚀操作通常用于消除小噪声或分离相连的物体。# 膨胀操作
    image_erode_dilate = cv2.dilate(image_erode,  # 输入图像(已经腐蚀过的图像)kernal        # 使用的内核
    )
    # `cv2.dilate()` 会增加前景(白色区域)的面积,填充空洞或连接断裂的部分。
    # 腐蚀和膨胀结合使用可以实现开运算(消除小噪声)或闭运算(填补小空洞)。# 显示腐蚀后的图像
    cv2.imshow("image_erode", image_erode)  # 显示腐蚀处理后的图像,窗口标题为 "image_erode"# 显示原始彩色图像
    cv2.imshow("image_binary", image_binary)  # 显示原始图像,窗口标题为 "image_binary"# 显示腐蚀后再膨胀的图像
    cv2.imshow("image_erode_dilate", image_erode_dilate)  # 显示膨胀处理后的图像,窗口标题为 "image_erode_dilate"# 等待用户按键后关闭窗口
    cv2.waitKey(0)  # 等待用户按下任意键,窗口保持打开
    


仿射变换函数

  • 功能:对图像进行线性变换,如旋转、缩放、平移等。
  • 函数cv2.warpAffine()
  • 参数
    1. src:输入图像。
    2. M:2x3 的仿射变换矩阵(通过 cv2.getAffineTransform() 生成)。
    3. dsize:输出图像的尺寸(宽度和高度)。
    4. flags:插值方法(如 cv2.INTER_LINEAR)。
    5. borderModeborderValue:用于处理边界像素。
  • 返回值
    • dst:变换后的图像。
  • 应用:图像旋转、缩放、平移、视角调整等。
  • 代码:
    import numpy as np  # 导入 NumPy,用于数值计算(此处未使用,但是常见的图像处理工具库)
    import cv2  # 导入 OpenCV 库,用于图像处理# 读取图像
    image_binary = cv2.imread("./lena.png")  # 从当前目录读取名为 "lena.png" 的图像文件(彩色图像)# 将彩色图像转换为灰度图像
    image_gray = cv2.cvtColor(image_binary, cv2.COLOR_BGR2GRAY)  # 使用 OpenCV 的颜色转换函数,将 BGR 图像转为灰度图像# 自适应二值化
    image_np_adaptive = cv2.adaptiveThreshold(image_gray,                # 输入灰度图像255,                       # 满足条件的像素值设置为 255cv2.ADAPTIVE_THRESH_GAUSSIAN_C,  # 使用高斯加权的邻域均值计算局部阈值cv2.THRESH_BINARY,         # 二值化模式为普通二值化7,                         # 邻域大小(blockSize),必须是奇数,这里为 7×7 的窗口5                          # 常量 C,用于调整阈值(阈值 = 局部均值 - C)
    )
    # 自适应二值化适用于光照不均匀的图像处理。参数 `blockSize` 和 `C` 会直接影响二值化结果。# 创建形态学操作的结构元素(内核)
    kernal = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,  # 内核形状为椭圆形(4, 4)              # 内核大小为 4×4 像素
    )
    # 注意:较小的内核会对图像做出细微的形态学改变,较大的内核会显著改变图像形状。# 腐蚀操作
    image_erode = cv2.erode(image_np_adaptive,  # 输入二值图像(经过自适应二值化的图像)kernal              # 使用的内核
    )
    # `cv2.erode()` 会减少前景(白色区域)的面积,移除边缘上的噪声点或小的白色区域。
    # 腐蚀操作通常用于消除小噪声或分离相连的物体。# 膨胀操作
    image_erode_dilate = cv2.dilate(image_erode,  # 输入图像(已经腐蚀过的图像)kernal        # 使用的内核
    )
    # `cv2.dilate()` 会增加前景(白色区域)的面积,填充空洞或连接断裂的部分。
    # 腐蚀和膨胀结合使用可以实现开运算(消除小噪声)或闭运算(填补小空洞)。# 显示腐蚀后的图像
    cv2.imshow("image_erode", image_erode)  # 显示腐蚀处理后的图像,窗口标题为 "image_erode"# 显示原始彩色图像
    cv2.imshow("image_binary", image_binary)  # 显示原始图像,窗口标题为 "image_binary"# 显示腐蚀后再膨胀的图像
    cv2.imshow("image_erode_dilate", image_erode_dilate)  # 显示膨胀处理后的图像,窗口标题为 "image_erode_dilate"# 等待用户按键后关闭窗口
    cv2.waitKey(0)  # 等待用户按下任意键,窗口保持打开
    


透视变换函数

  • 功能:对图像进行透视变换,从一个视角映射到另一个视角,校正倾斜图像或提取局部内容。
  • 函数cv2.warpPerspective()
  • 参数
    1. src:输入图像。
    2. M:3x3 的透视变换矩阵(通过 cv2.getPerspectiveTransform() 生成)。
    3. dsize:输出图像的尺寸。
    4. flagsborderModeborderValue:与仿射变换类似。
  • 返回值
    • dst:透视变换后的图像。
  • 应用:文档矫正、车牌识别、场景理解等。
  • 代码:
    import cv2  # 导入 OpenCV 库,用于图像处理
    import numpy as np  # 导入 NumPy 库,用于数组操作# 读取图像
    image = cv2.imread("./card.png")  # 从当前目录中读取名为 "card.png" 的图像文件# 检查图像是否成功加载
    if image is None:  # 如果图像加载失败print("Error: Image not found. Please check the file path.")  # 输出错误信息exit()  # 终止程序# 定义原图中的四个点和目标点
    point1 = np.array([[200, 100], [700, 150], [140, 400], [650, 460]], dtype=np.float32)
    # 说明:
    # `point1` 是原始图像中感兴趣区域(ROI)的四个顶点,表示需要校正的区域。
    # 每个点用 (x, y) 坐标表示。
    # 例如,(200, 100) 表示原图中左上角的一个点。point2 = np.array([[0, 0], [image.shape[1], 0], [0, image.shape[0]], [image.shape[1], image.shape[0]]], dtype=np.float32)
    # 说明:
    # `point2` 是透视变换后图像的目标点,定义了变换后的矩形区域。
    # (0, 0) 是左上角,(image.shape[1], 0) 是右上角,依次类推。
    # `image.shape[1]` 表示图像宽度,`image.shape[0]` 表示图像高度。# 获取透视变换矩阵
    M = cv2.getPerspectiveTransform(point1, point2)
    # 说明:
    # `cv2.getPerspectiveTransform()` 函数计算透视变换矩阵。
    # 参数:
    # - `point1`:原始图像中的四个点。
    # - `point2`:目标图像中的四个点。
    # 返回值:
    # - `M` 是一个 3x3 的透视变换矩阵。# 进行透视变换
    image_s = cv2.warpPerspective(image, M, (image.shape[1], image.shape[0]))
    # 说明:
    # `cv2.warpPerspective()` 函数对图像应用透视变换。
    # 参数:
    # - `image`:输入图像。
    # - `M`:透视变换矩阵。
    # - `(image.shape[1], image.shape[0])`:输出图像的大小(宽度、高度)。
    # 返回值:
    # - `image_s` 是经过透视变换后的图像。# 显示原图和矫正后的图像
    cv2.imshow("Original Image", image)  # 显示窗口标题为 "Original Image" 的原始图像
    cv2.imshow("Corrected Image", image_s)  # 显示窗口标题为 "Corrected Image" 的矫正后图像# 等待按键关闭窗口
    cv2.waitKey(0)  # 等待用户按下任意键后关闭所有窗口
    cv2.destroyAllWindows()  # 销毁所有窗口
    

版权声明:

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

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