計算機視覺基礎系列(python與opencv的操作與運用/tensorflow的基礎介紹)(十五)---直方圖

1 直方圖的引入

opencv在圖像處理方面的基礎應用,彩色圖像的相關知識和技術以及直方圖的均衡化和規定化的原理是必須提前掌握。

直方圖的概念,橫座標表示像素值0-255的值,縱座標表示像素值在整個圖像中的概率是多少,值在0-1之間。

直方圖均衡化:一張圖的直方圖沒有均勻分佈,可以使用均衡化方法,儘可能的離散化,則稱爲直方圖的均衡化

下面是直方圖的代碼:

import cv2
import numpy as np


def ImageHist(image, type):
    color = (255, 255, 255)
    windowName = 'Gray'
    if type ==31:
        color = (255, 0, 0)
        windowName = 'B Hist'
    elif type == 32:
        color = (0, 255, 0)
        windowName = 'G Hist'
    elif type == 33:
        color = (0, 0, 255)
        windowName = 'R Hist'
    # 1 image  2  [0]  3 mask None    4  256   5   0-255
    # 完成hist直方圖的統計,第一個參數:image,第二個參數,直方圖的通道,這裏是灰度直方圖,則爲0,全部用中括號括起來
    # 第三個參數用不到,第四個爲將直方圖分成多少份,總共256個灰度條,第五個參數是直方圖中各個像素的值,從0-255的像素都遍歷一下
    hist = cv2.calcHist([image], [0], None, [256], [0.0, 255.0])
    # 計算灰度直方圖的最小值,最大值的下表,運用下面的函數獲取
    minV, maxV, minL, maxL = cv2.minMaxLoc(hist)
    # 定義一個畫布
    histImg = np.zeros([256, 256, 3], np.uint8)
    for h in range(0, 256):
        # 歸一化
        intenNormal = int(hist[h]*256/maxV)
        cv2.line(histImg, (h, 256), (h, 256-intenNormal), color)
    cv2.imshow(windowName, histImg)
    return histImg


img = cv2.imread('1.jpg', 1)
# 將圖像分成三個顏色通道
channels = cv2.split(img)
for i in range(0, 3):
    ImageHist(channels[i], 31+i)
cv2.waitKey(0)

運行結果如下:

2 直方圖均衡化

直方圖均衡化操作用以下代碼的註釋順道一起解釋如下:

注意的是直方圖均衡化必須要在單通道處理裏面進行的。所以灰度圖應該是可以直接處理的,而彩色圖像是需要分成三個通道進行單個處理的,代碼如下:

import cv2
import numpy as np
img = cv2.imread('1.jpg', 1)
cv2.imshow('src', img)
# 使用直方圖均衡化的時候必須要對單通道進行處理,所以在灰度圖的時候可以直接處理,但是在彩色圖的時候必須要分成三個通道進行處理
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow('gray', gray)
dst1 = cv2.equalizeHist(gray)
cv2.imshow('dst1', dst1)
(b, g, r) = cv2.split(img)
bH = cv2.equalizeHist(b)
gH = cv2.equalizeHist(g)
rH = cv2.equalizeHist(r)
# 通道的合成
dst2 = cv2.merge((bH, gH, rH))
cv2.imshow('dst2', dst2)
cv2.waitKey(0)

處理的結果是:

3 YUV直方圖均衡化

這個方法用的較少,這裏只是提及一下。

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