Python+Opencv 圖像直方圖的基本概念,及使用大津算法進行圖像分割的程序實現

圖像直方圖的基本概念:

統計各個灰度級別在圖像中的出現次數或概率,並用直方圖顯示出來,一般直方圖顯示圖像數據時會以左暗又亮的分佈曲線形式呈現出來。

且具有圖像平移、旋轉、縮放不變性等衆多優點,直方圖在進行圖像計算處理時代價較小,所以經常用於圖像處理。

Lena圖像的灰度直方圖和RGB直方圖顯示:

輸入圖片說明

python程序實現,使用matplotlib模塊繪製:

# -*- coding:utf-8 -*-
#本程序用於顯示圖片的直方圖
import cv2  #導入opencv模塊
import numpy as np
import matplotlib.pyplot as plt

print("Hellow word!")     #打印“Hello word!”,驗證模塊導入成功

img = cv2.imread("lena.jpg")  #導入圖片,圖片放在程序所在目錄
cv2.namedWindow("imagshow", 2)   #創建一個窗口
cv2.imshow('imagshow', img)    #顯示原始圖片

gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #轉換爲灰度圖
plt.hist(gray.ravel(), 256, [0, 256]) #計算灰度直方圖
plt.show()

# 藍 綠 紅
color = ('b', 'g', 'r')#顏色分量
for i, col in enumerate(color):
    histr = cv2.calcHist([img], [i], None, [256], [0, 256])  #計算顏色分量直方圖
    plt.plot(histr, color=col)  #繪製直方圖
    plt.xlim([0, 256])
 
plt.show()   #顯示直方圖

cv2.waitKey()

大津算法的基本原理:

遍歷灰度取值,確定最佳閾值,使背景和目標之間的類間方差最大 (因爲二者差異最大);

  • 記t爲前景與背景的分割閾值,前景點數佔圖像比例爲w0,平均灰度爲u0;背景點數佔圖像比例爲w1,平均灰度爲u1。
  • 則圖像的總平均灰度爲:u=w0u0+w1u1。
  • 前景和背景圖象的方差:g=w0*(u0-u)(u0-u)+w1(u1-u)(u1-u)=w0w1*(u0-u1)*(u0-u1),此公式爲方差公式。
  • 可參照概率論課本上面的g的公式也就是下面程序中的sb的表達式。當方差g最大時,可以認爲此時前景和背景差異最大,此時的灰度t是最佳閾值sb = w0w1(u1-u0)*(u0-u1)

python算法實現及效果:

# -*- coding:utf-8 -*-
#本程序用於大津算法的實現
import cv2  #導入opencv模塊
import numpy as np


print("Hellow word!")     #打印“Hello word!”,驗證模塊導入成功

img = cv2.imread("test.jpg")  #導入圖片,圖片放在程序所在目錄
cv2.namedWindow("imagshow", 2)   #創建一個窗口
cv2.imshow('imagshow', img)    #顯示原始圖片

gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #轉換爲灰度圖
retval,dst = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU) #使用大津算法進行圖像二值化

cv2.namedWindow("dst", 2)   #創建一個窗口
cv2.imshow("dst", dst)


cv2.waitKey()

二值化效果圖及圖像直方圖:

輸入圖片說明

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章