<button id="ssm6u"><optgroup id="ssm6u"></optgroup></button>
  • 跳轉至

    顏色統計與分布曲線繪制

    概述

    圖像切割與ROI中我們截取了棋子的圖像.
    現在我們就要對這個圖像進行統計.并繪制棋子的色彩統計圖.

    keywords 色彩統計 statistic

    目標圖像

    20180202image_roi.png

    繪制灰度圖的統計直方圖

    之前我們在Matplotlib顯示彩圖節簡單講了一下matplotlib展示圖片的用法.

    在這一章我們繼續學習, 利用matploblib繪制統計直方圖.

    我們需要借助matploblib的matplotlib.pyplot.hist 這個函數, 你可以點擊鏈接查看其api文檔.

    首先我們將圖片讀入為img, 然后轉換為灰度圖gray.

    然后將gray 用numpy的ravel函數變為一維的扁平數組, 輸入到plt.hist 中.

    了解更多查看numpy.ravel -文檔

    最終我們得到灰度圖的統計圖.

    from matplotlib import pyplot as plt
    import numpy as np
    import cv2
    
    
    img = cv2.imread('little_chess.png')
    if img is None:
        print("圖片讀入失敗")
        exit()
    
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    '''
        1Darray: 一維數組 這里通過gray.ravel(),把灰度圖變為一維數組.
        bins: 統計分隔區間 如果是256 就是分成256份統計, 你可以修改這個值, 看不同的統計效果
        range: 統計數值的空間
    '''
    plt.hist(gray.ravel(), bins=256, range=[0, 256])
    plt.show()
    

    20180202_chess_grayscale_bins.png

    左邊比較密集的分布, 主要是就是chess區域, 然后右邊的那個高高的窄條, 主要是背景圖片.

    我們可以通過Matplotlib窗口的工具, 局部放大(放大鏡icon), 查看顏色分布的細節.

    20180202_chess_grayscale_bins2.png

    可以看到chess 主要分布在45-90左右.

    繪制BGR彩圖的統計直方圖

    BGR統計圖 V1

    我們為了計算圖片BGR 三個通道的像素統計, 我們可以借助cv2.calcHist 函數.

    cHist = cv2.calcHist([img], [cidx], None, [256], [0, 256])
    

    我們預先設定了RGB三個通道對應在畫布上筆觸的顏色.

    # Matplotlib預設的顏色字符
    bgrColor = ('b', 'g', 'r')
    

    然后我們使用python的枚舉器enumerate去遍歷bgrColor

    我們也可以將迭代器, 強制類型轉換為list,看一下它的值

    print(list(enumerate(bgrColor)))
    
    [(0, 'b'), (1, 'g'), (2, 'r')]
    
    for cidx, color in enumerate(bgrColor):
        # do something
    

    ps 這個不是必須的, 你也可以使用"原始"一些的方法, 這不過這樣更pythonic

    20180202_chess_rgb_bins.png

    '''
        繪制BGR彩圖的統計直方圖 V1
    '''
    from matplotlib import pyplot as plt
    import numpy as np
    import cv2
    
    # 讀入圖片
    img = cv2.imread('little_chess.png')
    if img is None:
        print("圖片讀入失敗, 請檢查圖片路徑及文件名")
        exit()
    
    
    # Matplotlib預設的顏色字符
    bgrColor = ('b', 'g', 'r')
    
    
    for cidx, color in enumerate(bgrColor):
        # cidx channel 序號
        # color r / g / b
        cHist = cv2.calcHist([img], [cidx], None, [256], [0, 256])
        # 繪制折線圖
        plt.plot(cHist, color=color)  
    
    
    # 設定畫布的范圍
    plt.xlim([0, 256])
    
    # 顯示畫面
    plt.show()
    

    BGR統計圖 V2

    如果我們直接繪制的話, 鋸齒狀會比較明顯, 我們很難一眼就看出BGR三個通道的布局范圍.

    所以我們要調整代碼.

    20180202_ches_rgb_bins2.png

    這就需要你對matplotlib有一定的了解, 知道如何設定x軸的標注. 代碼我注釋的已經很詳細, 需要你課后去查看對應的文檔跟博文.

    源代碼

    '''
        繪制BGR彩圖的統計直方圖
    '''
    from matplotlib import pyplot as plt
    import numpy as np
    import cv2
    
    # 讀入圖片
    img = cv2.imread('little_chess.png')
    if img is None:
        print("圖片讀入失敗, 請檢查圖片路徑及文件名")
        exit()
    
    # 創建畫布
    fig, ax = plt.subplots()
    
    # Matplotlib預設的顏色字符
    bgrColor = ('b', 'g', 'r')
    
    # 統計窗口間隔 , 設置小了鋸齒狀較為明顯 最小為1 最好可以被256整除
    bin_win  = 4
    # 設定統計窗口bins的總數
    bin_num = int(256/bin_win)
    # 控制畫布的窗口x坐標的稀疏程度. 最密集就設定xticks_win=1
    xticks_win = 2
    
    for cidx, color in enumerate(bgrColor):
        # cidx channel 序號
        # color r / g / b
        cHist = cv2.calcHist([img], [cidx], None, [bin_num], [0, 256])
        # 繪制折線圖
        ax.plot(cHist, color=color)  
    
    
    # 設定畫布的范圍
    ax.set_xlim([0, bin_num])
    # 設定x軸方向標注的位置
    ax.set_xticks(np.arange(0, bin_num, xticks_win))
    # 設定x軸方向標注的內容
    ax.set_xticklabels(list(range(0, 256, bin_win*xticks_win)),rotation=45)
    
    # 顯示畫面
    plt.show()
    

    作業CH4.2

    TASK01

    結合CH4.1,你可以做一個ROI顏色統計小工具.

    要求你選擇ROI區域后, 然后就可以看到對應的顏色直方圖. 同時展示RGB 與 Graysacle的兩種模式的直方圖.

    并且ROI區域可以重復選擇.

    TASK02

    在本章我們學會了如何利用cv2.calcHist 獲取單個通道圖片的統計.

    那么, 如何不通過人眼, 就計算出畫面中占比最大色塊的顏色分布范圍呢 ? 如何才能得出最大值與最小值.

    綜合三個通道, 你就可以獲取到 BGR三通道的閾值上界與閾值下界

    TASK03 拓展

    觀察一下統計圖, 你可能會發現顏色分布跟正態分布很相似, 顏色直方圖其實是多個正態分布圖的累加.

    那么你有沒有方法, 可以獲取畫面中占比最大色塊對應的正態分布參數.

    \mu

    \sigma

    并在直方圖上繪制模擬的正態分布曲線.

    1465780648-2744026701.jpg


    韩国精品无码一区二区三区,精品无码一区二区三区AV,欧洲丰满美熟女乱又伦AV,亚洲午夜久久久影院伊人