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

1 灰度圖的直方圖均衡化

灰度直方圖的均衡化的過程是一個累計概率完成映射的過程,舉個例子:

像素0-100的概率累計相加得到0.5,則用255*0.5進行映射得到50來代替這個100這個像素值。又相應的API,這裏就不做API的代碼了,我們寫均衡化的源碼,代碼如下:

import cv2
import numpy as np
img = cv2.imread('1.jpg', 1)
cv2.imshow('src', img)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow('dst', gray)
count = np.zeros(256, np.float)
for i in range(0, height):
    for j in range(0, width):
        pixel = gray[i, j]
        # 轉化爲int類型
        index = int(pixel)
        count[index] = count[index]+1
for i in range(0, 255):
    count[i] = count[i]/(height*width)
sum1 = float(0)
for i in range(0, 256):
    sum1 = sum1 + count[i]
    count[i] = sum1
# print(count)
# 計算映射表
map1 = np.zeros(256, np.uint16)
for i in range(0, 256):
    map1[i] = np.uint16(count[i]*255)
# 映射
for i in range(0, height):
    for j in range(0, width):
        pixel = gray[i, j]
        gray[i, j] = map1[pixel]
cv2.imshow('dst2', gray)
cv2.waitKey(0)

得到的效果如下:

2 彩色直方圖均衡化

原理和灰度直方圖均衡化一樣,下面是源碼

import cv2
import numpy as np
img = cv2.imread('1.jpg', 1)
cv2.imshow('src', img)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
count_b = np.zeros(256, np.float)
count_g = np.zeros(256, np.float)
count_r = np.zeros(256, np.float)
for i in range(0, height):
    for j in range(0, width):
        (b, g, r) = img[i, j]
        # 轉化爲int類型
        index_b = int(b)
        index_g = int(g)
        index_r = int(r)
        count_b[index_b] = count_b[index_b]+1
        count_g[index_g] = count_g[index_g] + 1
        count_r[index_r] = count_r[index_r] + 1
for i in range(0, 255):
    count_b[i] = count_b[i] / (height*width)
    count_g[i] = count_g[i] / (height * width)
    count_r[i] = count_r[i] / (height * width)
sum1 = float(0)
sum2 = float(0)
sum3 = float(0)
for i in range(0, 256):
    sum1 = sum1 + count_b[i]
    sum2 = sum2 + count_g[i]
    sum3 = sum3 + count_r[i]
    count_b[i] = sum1
    count_g[i] = sum2
    count_r[i] = sum3
# print(count)
# 計算映射表
map1 = np.zeros(256, np.uint16)
map2 = np.zeros(256, np.uint16)
map3 = np.zeros(256, np.uint16)
for i in range(0, 256):
    map1[i] = np.uint16(count_b[i]*255)
    map2[i] = np.uint16(count_g[i]*255)
    map3[i] = np.uint16(count_r[i]*255)
dst = np.zeros((height, width, 3), np.uint8)
# 映射
for i in range(0, height):
    for j in range(0, width):
        (b, g, r) = img[i, j]
        b = map1[b]
        g = map2[g]
        r = map3[r]
        dst[i, j] = (b, g, r)
cv2.imshow('dst2', dst)
cv2.waitKey(0)

代碼較爲簡單,效果圖如下:

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