• 【Python计算机视觉】Python全栈体系(二十六)


    计算机视觉

    第七章 综合案例

    一、利用OpenCV实现图像校正

    1. 任务描述

    • 我们对图像中的目标进行分析和检测时,目标往往具有一定的倾斜角度,自然条件下拍摄的图像,完全平正是很少的。因此,需要将倾斜的目标“扶正”的过程就叫做图像矫正。该案例中使用的原始图像如下:
      在这里插入图片描述

    2. 代码

    # 图像矫正示例
    import cv2
    import numpy as np
    import math
    
    im = cv2.imread("../data/paper.jpg")
    cv2.imshow("im", im)
    # 灰度化
    im_gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
    # 边缘提取
    # sobel 效果不好,不采用
    # sobel = cv2.Sobel(im_gray, cv2.CV_64F, 1, 1, ksize=5)
    # cv2.imshow("sobel", sobel)
    # Laplacian 效果不好,不采用
    # lap = cv2.Laplacian(im_gray, cv2.CV_64F)
    # cv2.imshow("Laplacian", lap)
    
    # 模糊化:去掉过细的细节
    blurred = cv2.GaussianBlur(im_gray, (5, 5), 0)
    # 膨胀:将过细的细节合并
    dilate = cv2.dilate(blurred, (3, 3))
    
    # canny
    canny = cv2.Canny(dilate, 30, 120)
    # cv2.imshow("canny", canny)
    
    # 轮廓检测
    cnts, hie = cv2.findContours(canny.copy(), # 原始图像
                                      cv2.RETR_EXTERNAL, # 只检测外轮廓
                                      cv2.CHAIN_APPROX_SIMPLE) # 只保留轮廓的终点坐标
    # 绘制轮廓
    im_cnt = cv2.drawContours(im, cnts, -1, (0, 0, 255), 2)
    cv2.imshow("im_cnt", im_cnt)
    
    docCnt = None
    
    # 计算轮廓面积,排序
    if len(cnts) > 0:
        cnts = sorted(cnts, # 可迭代对象
                      key=cv2.contourArea, # 排序依据,计算轮廓面积,根据面积排序
                      reverse=True) # 逆序排列
        for c in cnts: # 遍历排序后的每个轮廓
            peri = cv2.arcLength(c, True) # 计算封闭轮廓周长
            approx = cv2.approxPolyDP(c, 0.02*peri, True) # 多边形拟合
            # 拟合出的第一个四边形认为是纸张的轮廓
            if len(approx) == 4:
                docCnt = approx
                break
    # 绘制找到的四边形的交点
    points = []
    for peak in docCnt:
        peak = peak[0] # 取出坐标
        # 绘制角点
        cv2.circle(im, # 绘制的图像
                   tuple(peak), 10, # 圆心,半径
                   (0, 0, 255), 2) # 绘制圆形线条颜色和粗细
        points.append(peak) # 坐标添加到列表
    cv2.imshow("im_point", im)
    
    # 矫正
    # 原纸张逆时针方向四个角点
    src = np.float32([points[0], points[1], points[2], points[3]])
    dst = np.float32([[0, 0], [0, 488], [337, 488], [337, 0]])
    m = cv2.getPerspectiveTransform(src, dst) # 生成透视矩阵
    result = cv2.warpPerspective(im_gray.copy(), m, (337,488)) # 透视变换
    
    cv2.imshow("result", result)
    
    cv2.waitKey()  # 等待用户按某个按键
    cv2.destroyAllWindows()  # 销毁所有创建的窗口
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70

    在这里插入图片描述

    二、利用OpenCV检测芯片瑕疵

    1. 任务描述

    • 利用图像技术,检测出芯片镀盘区域瑕疵。样本图像中,粉红色区域为镀盘区域,镀盘内部空洞为瑕疵区域,利用图像技术检测镀盘是否存在瑕疵,如果存在则将瑕疵区域标记出来。
      在这里插入图片描述

    2. 思路

    • 将原始图像读取出来,做灰度化处理
    • 经过灰度化处理以后发现,目标区域的颜色要浅一些,所以做了二值化处理
    • 经过二值化处理以后,做了实心的填充,实心化填充之前要取出轮廓
    • 实心化填充以后,有瑕疵和没有瑕疵,两张图片的对比就很明显了,所以就做了图像的减法
    • 图像减法是求出两幅图像之间的差异,所以就把瑕疵给找了出来
    • 经过观察发现,瑕疵区域有一些很小的瑕疵点,没有连接在一起,所以又做了闭运算,先膨胀后腐蚀,把原本没有连在一起的区域连在一起,膨胀以后瑕疵区域会变大,所以又做了腐蚀,把瑕疵区域还原成原来的大小
    • 再把瑕疵的轮廓找出来,绘制最小外接圆形,再在原始图像上绘制一个彩色的圆形,这样瑕疵所在的位置就很明显了
    • 最后一步,计算瑕疵的面积,瑕疵面积这里可以使用轮廓的面积,使用外接圆的面积,面积大于一定的数值就认为它有瑕疵

    3. 代码

    # 利用图像技术实现芯片瑕疵检测
    import cv2
    import numpy as np
    import math
    
    im = cv2.imread("../data/CPU3.png")  # 读取彩色图像
    cv2.imshow("im", im)
    # 灰度化
    im_gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
    cv2.imshow("im_gray", im_gray)
    # 二值化
    ret, im_bin = cv2.threshold(im_gray, 162, 255, cv2.THRESH_BINARY)
    cv2.imshow("im_bin", im_bin)
    # 提取轮廓,实心化填充
    cnts, hie = cv2.findContours(im_bin, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
    mask = np.zeros(im_bin.shape, np.uint8)  # 创建值全为0的矩阵,形状和im_bin一致
    im_fill = cv2.drawContours(mask, cnts, -1, (255, 0, 0), -1)  # 绘制轮廓并进行实心填充
    cv2.imshow("im_fill", im_fill)
    # 图像减法,找出瑕疵区域
    im_sub = cv2.subtract(im_fill, im_bin)
    cv2.imshow("im_sub", im_sub)
    # 图像的闭运算(先膨胀后腐蚀),将离散的瑕疵点合并在一起
    k = np.ones((10, 10), np.uint8)
    im_close = cv2.morphologyEx(im_sub, cv2.MORPH_CLOSE, k, iterations=3)
    cv2.imshow("im_close", im_close)
    # 提取瑕疵区域轮廓,绘制最小外接圆形
    cnts, hie = cv2.findContours(im_close, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
    # 产生最小外接圆数据
    (x, y), radius = cv2.minEnclosingCircle(cnts[1])
    center = (int(x), int(y))
    radius = int(radius)
    cv2.circle(im_close, center, radius, (255, 0, 0), 2)  # 绘制瑕疵的最小外接圆形
    cv2.imshow("im_circle", im_close)
    # 在原始图像上绘制瑕疵
    cv2.circle(im, center, radius, (0, 0, 255), 2)
    cv2.imshow("im_result", im)
    # 计算外接圆形的面积
    area = math.pi * radius * radius
    print("area:", area)
    if area > 12:
        print("镀盘表明有瑕疵")
    
    cv2.waitKey()  # 等待用户按某个按键
    cv2.destroyAllWindows()  # 销毁所有创建的窗口
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    在这里插入图片描述

    第八章 视频基本处理

    一、读取摄像头

    # 从摄像头读取图像并播放
    import cv2
    
    # 实例化VideoCapture对象,参数0表示第一个摄像头
    cap = cv2.VideoCapture(0)
    while cap.isOpened():   # 摄像头处于打开状态
        ret, frame = cap.read() # 捕获帧
        # 每次读取帧后显示在同一个窗体里,这样连续的窗体显示就形成视频
        cv2.imshow("frame", frame)
        c = cv2.waitKey(1) # 等待1毫秒,等待用户敲击按键
        if c == 27: # ESC键
            break
    cap.release() # 释放视频设备资源
    cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    二、播放视频文件

    # 读取视频文件并播放
    import cv2
    
    # 创建对象,并指定打开的视频文件路径
    cap = cv2.VideoCapture("D:\\Alex\\Music\\MV\\2750443843.mp4")
    while cap.isOpened():
        ret, frame = cap.read() # 读取帧
        cv2.imshow("frame", frame) # 显示
        c = cv2.waitKey(25) # 等待用户敲击按键
        if c == 27:
            break
    cap.release()
    cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    三、捕获并保存视频

    # 录制视频文件
    # 两个过程:读取、写入文件
    import cv2
    
    cap = cv2.VideoCapture(0)
    fourcc = cv2.VideoWriter_fourcc("I", "4", "2", "0") # 编解码4字标记值
    out = cv2.VideoWriter("output.avi", # 视频文件名称
                          fourcc,  # 编解码格式
                          20, # 帧速度
                          (640,480)) # 分辨率
    while cap.isOpened():
        ret, frame = cap.read() # 捕获帧
        if ret == True:
            out.write(frame) # 写入帧
            cv2.imshow("frame", frame) # 显示帧
            if cv2.waitKey(1) == 27: # ESC键
                break
        else:
            break
    
    cap.release()
    out.release()
    cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    第九章 图像预处理在AI中的应用

    • 图像预处理的目的,是让图像数据更适合AI模型进行处理,例如调整大小、颜色
    • 通过图像预处理技术,实现数据集的扩充,这种方法称为数据增强。数据增强主要方法有:缩放,拉伸,加入噪点,翻转,旋转,平移,剪切,对比度调整,通道变化。

    一、图像数据增强

    在这里插入图片描述

    二、纯图像技术的缺陷

    • 到目前为止,我们使用的基本是纯图像技术,对图像大小、颜色、形状、轮廓、边沿进行变换和处理,但这些技术都有一个共同的缺点,即无法理解图像内容和场景,要实现这个目标,必须借助于深度学习技术。
  • 相关阅读:
    java计算机毕业设计ssm+vue高校人事管理系统
    我理解的算法 - 53.最大子数组和(超经典多种解法:强推、动态规划、Kadane算法)
    HM4064原厂5A四节锂电池充电管理集成电路IC
    Ubuntu 系统如何修改时间
    JVM-垃圾回收
    HTML之表格、表单
    Linux 内核启动分析
    数据结构 每日一练:将带头结点的单链表就地逆置(视频讲解两种方法)
    linux高性能服务器
    【操作与配置】WSL配置LINUX
  • 原文地址:https://blog.csdn.net/sgsgkxkx/article/details/126020779