• 9月16日计算机视觉基础学习笔记——认识机器视觉



    前言

    本文为9月16日计算机视觉基础学习笔记——认识机器视觉,分为四个章节:

    • Week 1 homework;
    • 从图像处理到计算机视觉;
    • 计算机视觉的两个步骤;
    • 图像描述子。

    一、Week 1 homework

    1、基本操作

    import cv2 as cv
    import matplotlib.pyplot as plt
    import numpy as np
    
    img = cv.imread("week1_homework.png")
    img_RGB = cv.cvtColor(img, cv.COLOR_BGR2RGB)
    
    plt.figure(figsize=(10, 10))
    plt.imshow(img_RGB)
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    1

    2、滤波

    # 滤波
    # 边缘提取
    kernel = np.ones((3, 3), np.float32) / 9   # 平均滤波
    
    # X 方向梯度
    # kernel[0, :] = [-1, 0, 1]
    # kernel[1, :] = [-1, 0, 1]
    # kernel[2, :] = [-1, 0, 1]
    
    # Y 方向梯度
    kernel[0, :] = [-1, -1, -1]
    kernel[1, :] = [0, 0, 0]
    kernel[2, :] = [1, 1, 1]
    
    
    print(kernel)
    >>> [[-1. -1. -1.]
         [ 0.  0.  0.]
         [ 1.  1.  1.]]
    
    print(img_RGB.shape)
    >>> (1000, 707, 3)
    
    result = cv.filter2D(img_RGB, -1, kernel)
    print(result.shape)
    >>> (1000, 707, 3)
    print(result[0, 0])
    >>> [0 0 0]
    
    plt.figure(figsize=(20, 20))
    plt.imshow(cv.hconcat([img_RGB, result])) # 水平拼接
    plt.show()
    
    • 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

    2

    • 更大滤波核 & 更多次滤波:
    # 更大滤波核 & 更多次滤波
    kernel = np.ones((15, 15), np.float32) / (15 * 15)
    
    img1 = cv.filter2D(img_RGB, -1, kernel)
    result = cv.filter2D(img1, -1, kernel)
    
    # 显示滤波前后对比
    plt.figure(figsize=(20, 20))
    plt.imshow(cv.hconcat([img_RGB, result]))
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    3

    • 只对肤色区域滤波:
    result_show = result.copy()
    # 肤色检测
    hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV)
    (_h, _s, _v) = cv.split(hsv) # 图像分割,分别获取 h,s,v通道分量图像
    print(_h.shape)
    >>> (1000, 707)
    
    skin3 = np.zeros(_h.shape, dtype = np.uint8)  # 根据源图像的大小创建一个全0的矩阵,用于保存图像数据
    (x, y) = _h.shape  # 获取图像数据的长和宽
    
    # 遍历图像。判断 HSV 通道的数值,若在指定范围中,则设置像素点为 255, 否则设为 0
    for i in range(0, x):
        for j in range(0, y):
            if (5 < _h[i][j] < 70) and (_s[i][j] > 18) and (50 < _v[i][j] < 255):
                skin3[i][j] = 1.0
                result_show[i][j] = img_RGB[i][j] * skin3[i][j]
            else:
                skin3[i][j] = 0.0
            
    # result_show_RGB = cv.cvtColor(result_show, cv.COLOR_BGR2RGB)
    
    plt.figure(figsize=(20, 20))
    plt.imshow(cv.hconcat([img_RGB, result_show_RGB, result]))
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    4

    skin3 = cv.cvtColor(skin3, cv.COLOR_BGR2RGB)
    plt.imshow(skin3)
    plt.show()
    
    • 1
    • 2
    • 3

    5


    二、从图像处理到计算机视觉

    import cv2 as cv
    import matplotlib.pyplot as plt
    import sys
    import os
    
    def BGRtoRGB(img):
        return cv.cvtColor(img, cv.COLOR_BGR2RGB)
    
    img = cv.imread("tangsan.jpg")
    dog = cv.imread("dog.png")
    
    gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    dog_gray = cv.cvtColor(dog, cv.COLOR_BGR2GRAY)
    print(dog.shape)
    >>> (852, 590, 3)
    
    plt.figure(figsize=(11, 11))
    plt.imshow(BGRtoRGB(img))
    plt.show()
    
    plt.imshow(gray, cmap="gray")
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    1
    2

    1、反色变换

    reverse_c = img.copy()
    rows = img.shape[0]
    cols = img.shape[1]
    depths = img.shape[2]
    
    for i in range(rows):
        for j in range(cols):
            for d in range(depths):
                reverse_c[i][j][d] = 255 - reverse_c[i][j][d]
                
    plt.imshow(BGRtoRGB(cv.hconcat([img, reverse_c])))
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    4

    2、Gamma 变换

    gamma_c = dog.copy()
    rows = dog.shape[0]
    cols = dog.shape[1]
    depths = dog.shape[2]
    
    for i in range(rows):
        for j in range(cols):
            for d in range(depths):
                gamma_c[i][j][d] = 3 * pow(gamma_c[i][j][d], 0.9)
                
    plt.imshow(BGRtoRGB(cv.hconcat([dog, gamma_c])))
    plt.show()       
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    5

    3、直方图 & 直方图均衡化

    3

    • 计算直方图:
    import numpy as np
    
    hist = np.zeros(256)
    
    rows = img.shape[0]
    cols = img.shape[1]
    
    for i in range(rows):
        for j in range(cols):
            tmp = gray[i][j]
            hist[tmp] = hist[tmp] + 1
    
    plt.plot(hist)
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    6

    • 直方图均衡化:
    trans = hist / (rows * cols) * 255
    for i in range(1, len(trans)):
        trans[i] = trans[i-1] + trans[i]
    
    print(int(trans[0]))
    print(trans.shape)
    >>> 0
    >>> (256,)
    
    gray_h = gray.copy()
    for i in range(rows):
        for j in range(cols):
            gray_h[i][j] = int(trans[gray[i][j]])
    
    plt.figure(figsize=(10,10))
    plt.imshow(cv.vconcat([gray,gray_h]),cmap='gray')
    plt.title("scr and Histogram Equalization")
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    7

    hist_h = np.zeros(256)
    for i in range(rows):
        for j in range(cols):
            tmp = gray_h[i][j]
            hist_h[tmp] = hist_h[tmp] + 1
            
    plt.plot(hist_h)
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    8


    三、计算机视觉的两个步骤

    1、提取特征 feature

    9

    2、决策函数

    10


    四、图像描述子

    1、HOG(Histogram of Oriented Gradient)

    11

    • 步骤:
      1. 灰度化 + Gamma 变换 / 直方图均衡化;
      2. 计算每个像素的梯度(大小 + 方向):
        D G ( x , y ) D x = G ( x + 1 , y ) − G ( x − 1 , y ) D G ( x , y ) D y = G ( x , y + ) − G ( x , y − 1 ) \frac{DG(x, y)}{Dx} = G(x+1, y) - G(x-1, y)\\ \frac{DG(x, y)}{Dy} = G(x, y+) - G(x, y-1) DxDG(x,y)=G(x+1,y)G(x1,y)DyDG(x,y)=G(x,y+)G(x,y1)
        • 相当于卷积:
          [ 0 − 1 0 − 1 0 1 0 1 0 ] = [ − 1 0 1 ] [ − 1 0 1 ]

          [010101010]" role="presentation" style="position: relative;">[010101010]
          =
          [101]" role="presentation" style="position: relative;">[101]
          [101]" role="presentation" style="position: relative;">[101]
          010101010 = 101 [101]

        • 得到两张图:

          • 梯度的大小: D x 2 + D y 2 \sqrt{D_x^2 + D_y^2} Dx2+Dy2
          • 梯度的方向: a r c t a n D y D x arctan\frac{D_y}{D_x} arctanDxDy.
      3. 将图像分成小 cells(6×6)
      4. 统计每个 cell 的梯度直方图,每个 cell 一个结果(Description 描述子——18维);
      5. 将每 3×3 个 cell 组成一个 block,每个 cell 的结果串起来,得到 block 的结果(Description——162维),然后归一化,即我们需要的结果。

    2、LBP(Local Binary Pattern)

    12

    局部二值模式。

    • 步骤:
      1. 将图像分成 16×16 的cell;
      2. 对 cell 中的每个像素计算其对应的 LBP 值;
      3. 计算每个 cell 的直方图,然后归一化;
      4. 将每个 cell 的直方图连起来,就得到这张图的描述子。

    3、Haar-like

    反映图像的灰度变化情况。

    13


  • 相关阅读:
    Dos系统的Debug工具简单使用(2023.9.7)
    Java之三大特性
    Prometheus-4:服务自动发现Service Discovery
    CentOS 9安装Kubernetes(k8s)集群
    虎牙、斗鱼同道同命:共同御寒
    MySQL---多表联合查询(下)(内连接查询、外连接查询、子查询(ALL/ANY/SOME/IN/EXISTS关键字)、自关联查询)
    【设计模式】使用原型模式完成业务中“各种O”的转换
    Hadoop的HDFS的集群安装部署
    Docker安装Nginx教程步骤
    2022运营版开发代驾小程序/仿滴滴代驾小程序/打车/网约车/顺风车/快车/代驾/货运/Thinkphp+Uniapp开源版
  • 原文地址:https://blog.csdn.net/Ashen_0nee/article/details/126883223