<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    [Python圖像處理] 十一.灰度直方圖概念及OpenCV繪制直方圖

    VSole2022-05-10 21:14:33
    學Python近八年,認識了很多大佬和朋友,感恩。深知自己很菜,得拼命努力前行,編程也沒有什么捷徑,干就對了。希望未來能更透徹學習和撰寫文章,同時非常感謝參考文獻中的大佬們的文章和分享,共勉。
    - https://blog.csdn.net/eastmount

    一. 灰度直方圖基本概念

    什么是灰度直方圖?

    灰度直方圖(histogram)是灰度級的函數,描述的是圖像中每種灰度級像素的個數,反映圖像中每種灰度出現的頻率。橫坐標是灰度級,縱坐標是灰度級出現的頻率。

    對于連續圖像,平滑地從中心的高灰度級變化到邊緣的低灰度級。直方圖定義為:

    其中A(D)為閾值面積函數:為一幅連續圖像中被具有灰度級D的所有輪廓線所包圍的面積。對于離散函數,固定ΔD為1,則:H(D)=A(D)-A(D+1)。

    色彩直方圖是高維直方圖的特例,它統計色彩的出現頻率,即色彩概率分布信息。通常這需要一定的量化過程,將色彩分成若干互不重疊的種類。一般不直接在RGB色彩空間中統計,而是在將亮度分離出來后,對代表色彩部分的信息進行統計,如在HSI空間的HS子空間、YUV空間的UV子空間,以及其它反映人類視覺特點的彩色空間表示中進行。

    直方圖的計算方法如下:

    依據定義,若圖像具有L(通常L=256,即8位灰度級)級灰度,則大小為MxN的灰度圖像f(x,y)的灰度直方圖hist[0…L-1]可用如下計算獲得。

    • 初始化 hist[k]=0; k=0,…,L-1
    • 統計 hist[f(x,y)]++; x=0,…,M-1, y =0,…,N-1

    • 歸一化 hist[f(x,y)]/=M*N

    那么說了這么多,直方圖究竟有什么作用呢?

    在使用輪廓線確定物體邊界時,通過直方圖更好的選擇邊界閾值,進行閾值化處理;對物體與背景有較強對比的景物的分割特別有用;簡單物體的面積和綜合光密度IOD可以通過圖像的直方圖求得。


    二. 繪制直方圖

    1.基礎概念

    在直方圖中,橫坐標表示圖像中各個像素點的灰度級,縱坐標表示具有該灰度級的像素個數。

    假設存在一個3*3的圖像,如下圖所示,x數組統計的是像素點的灰度級,y數組統計的是具有該灰度級的像素個數。其中,灰度為1的像素共3個,灰度為2的像素共1個,灰度為3的像素共2個,灰度為4的像素共1個,灰度為5的像素共2個。

    • x = [1, 2, 3, 4, 5]
    • y = [3, 1, 2, 1, 2]

    繪制的折線圖如下所示:

    繪制的直方圖如下所示:

    如果灰度級為0-255(最小值0黑色,最大值255白色),同樣可以繪制對應的直方圖,下圖是三張圖片拼接而成及其對應的直方圖。


    2.歸一化直方圖

    該直方圖的橫坐標表示圖像中各個像素點的灰度級,縱坐標表示出現這個灰度級的概率。其計算方法如下:

    (1) 先計算灰度級及對應像素的個數

    x = [1, 2, 3, 4, 5]

    t = [3, 1, 2, 1, 2]

    (2) 統計總的像素個數

    n = (3 + 1 + 2 + 1 +2) = 9

    (3) 統計各個灰度級的出現概率

    y = t / n = [3/9, 1/9, 2/9, 1/9, 2/9]


    3.繪制直方圖

    主要調用matplotlib的子庫pyplot實現,它提供了類似于Matlab的繪圖框架,matplotlib是非常強大基礎的一個Python繪圖包。Provides a Matlab-like plotting framework. 導入代碼如下:

    import matplotlib.pyplot as plt
    

    其中繪制直方圖主要調用hist函數實現,它根據數據源和像素級繪制直方圖。函數原型如下:

    hist(數據源, 像素級)
    參數:
    數據源必須是一維數組,通常需要通過函數ravel()拉直圖像
    像素級一般是256,表示[0, 255]
    

    函數ravel()將多維數組降為一維數組,格式為:

    一維數組 = 多維數組.ravel()


    4.代碼實現

    #encoding:utf-8
    import cv2  
    import numpy as np
    import matplotlib.pyplot as plt
    
    src = cv2.imread('test01.jpg')
    cv2.imshow("src", src)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    plt.hist(src.ravel(), 256)
    plt.show()
    

    輸出結果如下所示:


    三. 使用OpenCV統計繪制直方圖

    1.函數原型

    前面講解調用matplotlib庫繪制直方圖,接下來講解使用OpenCV統計繪制直方圖的例子。

    • 直方圖橫坐標:圖像中各個像素點的灰度級
    • 直方圖縱坐標:具有該灰度級的像素個數

    主要調用函數calcHist()實現:

    • hist = cv2.calcHist(images, channels, mask, histSize, ranges, accumulate)

    參數:

    • hist表示直方圖,返回的是一個二維數組
    • images表示原始圖像
    • channels表示指定通道,通道編號需要用中括號括起,輸入圖像是灰度圖像時,它的值為[0],彩色圖像則為[0]、[1]、[2],分別表示B、G、R
    • mask表示掩碼圖像,統計整副圖像的直方圖,設為None,統計圖像的某一部分直方圖時,需要掩碼圖像
    • histSize表示BINS的數量,參數子集的數目,如下圖當bins=3表示三個灰度級

     

    • ranges表示像素值范圍,例如[0, 255]
    • accumulate表示累計疊加標識,默認為false,如果被設置為true,則直方圖在開始分配時不會被清零,該參數允許從多個對象中計算單個直方圖,或者用于實時更新直方圖;多個直方圖的累積結果用于對一組圖像的直方圖計算


    2.代碼實現

    首先計算圖像灰度級的基本大小、形狀及內容。

    #encoding:utf-8
    import cv2  
    import numpy as np
    import matplotlib.pyplot as plt
    
    src = cv2.imread('test01.jpg')
    #參數:原圖像 通道[0]-B 掩碼 BINS為256 像素范圍0-255 
    hist = cv2.calcHist([src], [0], None, [256], [0,255])
    print(type(hist))
    print(hist.size)
    print(hist.shape)
    print(hist)
    

    輸出結果如下所示:

    下面是繪制圖像的代碼,首先補充一些matplotlib庫繪制圖像代碼,也推薦我的文章。

    • 六.Numpy、Pandas和Matplotlib包基礎知識
    #encoding:utf-8
    import cv2  
    import numpy as np
    import matplotlib.pyplot as plt
    
    #繪制sin函數曲線
    x1 = np.arange(0, 6, 0.1)
    y1 = np.sin(x1)
    plt.plot(x1, y1)
    
    #繪制坐標點折現
    x2 = [0, 1, 2, 3, 4, 5, 6]
    y2 = [0.3, 0.4, 2.5, 3.4, 4, 5.8, 7.2]
    plt.plot(x2, y2)
    
    #省略有規則遞增的x2參數 
    y3 = [0, 0.5, 1.5, 2.4, 4.6, 8]
    plt.plot(y3, color="r")
    
    plt.show()
    

    輸出結果有三條線,如下所示:

    最后給出調用calcHist()計算B、G、R灰度級并繪制圖形的代碼。

    #encoding:utf-8
    import cv2  
    import numpy as np
    import matplotlib.pyplot as plt
    
    src = cv2.imread('test01.jpg')
    
    histb = cv2.calcHist([src], [0], None, [256], [0,255])
    histg = cv2.calcHist([src], [1], None, [256], [0,255])
    histr = cv2.calcHist([src], [2], None, [256], [0,255])
    
    cv2.imshow("src", src)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    plt.plot(histb, color='b')
    plt.plot(histg, color='g')
    plt.plot(histr, color='r')
    plt.show()
    

    輸出結果如下圖所示:

     

    四.總結

    寫到這里,本篇文章介紹結束,基礎性知識希望對您有所幫助。

    • 一.灰度直方圖基本概率
    • 二.繪制直方圖
    • 三.使用OpenCV統計繪制直方圖
    • 四.總結
    直方圖灰度圖像
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    Python圖像處理第11篇介紹灰度直方圖
    工業互聯網是新一代信息通信技術與工業控制技術深度融合的新型基礎設施,通過對人、機、物、系統等的全面連接,構建起覆蓋全產業鏈、全價值鏈的全新制造和服務體系,為工業乃至產業數字化、網絡化、智能化發展提供了實現途徑。
    1 賽題回顧 2 最終排名(部分) 3 啟發與思路 4 算法與模型 函數名(CG圖) 復賽模型融合 Section信息 字符匹配 Yara匹配 Opcode 4. 其他布爾信息 灰度直方圖 PE靜態特征模型 特征工程 5 結果與改進 復...
    默認情況下,按時間倒序排列,首先顯示最新的文檔。Lucene查詢語法Kibana查詢語言基于Lucene查詢語法。這就意味著,會匹配到"Quick brown fox",而不會匹配"quick fox brown"。查詢解析器將不再基于空格進行分割。多個搜索項必須由明確的布爾運算符分隔。注意,布爾運算符不區分大小寫。在Lucene中,response:200 extension:php 等價于 response:200 and extension:php。這將匹配response字段值匹配200并且extenion字段值匹配php的文檔。默認情況下,and 比 or 具有更高優先級。
    個人的研究方向為人工智能安全,所以本文以人工智能安全領域為例,以實際技術展現“沒有銀彈”這一真香定律是如何被印證的。他們在logits上采用softplus函數來計算魯棒損失值,然后將其與自然訓練損失(α=0)相結合。
    紅色橢圓為EKF估算的協方差。PF本地化會用到該測量結果。紅十字是實際位置,黑點是RFID的位置。藍色格子是直方圖濾波器的概率位置。濾波器整合了速度輸入和從RFID獲得距離觀測數據進行本地化。紅叉是通過距離傳感器觀測到的點。紅圈是使用圓形擬合估計的物體形狀。藍線是實際路徑,黑線是導航推測,紅線是FastSLAM的推測路徑。
    Python從零到壹第17篇介紹可視化分析,希望您喜歡
    ?機器學習算法依靠在數據中觀察到的用戶知識和模式,對我們可能喜歡或感興趣的內容做出推斷和建議。
    在學習貝葉斯計算的解馬爾可夫鏈蒙特卡洛模擬時,最簡單的方法是使用PyMC3,構建模型,調用Metropolis優化器。貝葉斯線性回歸包含了幾十個概念和定義,這使得我們的整個研究成為一種折磨,并且真正發生的事情。
    隨著深度學習在計算機安全領域越來越受到重視,不同類型的神經網絡已被集成到安全系統中,以完成惡意軟件檢測,二進制分析,以及漏洞發現等多種任務。然而,神經網絡的預測結果難以得到解釋,例如難以確定輸入數據的哪些特征對預測結果產生貢獻,這一定程度上影響到了深度學習方法的應用。已有研究人員通過近似神經網絡的決策函數來確定不同特征對預測結果的貢獻,如LEMNA方法,并已在不同的安全應用中取得了良好的效果。該方
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类