1. 程式人生 > >灰度直方圖均衡化----python實現

灰度直方圖均衡化----python實現

分布函數 name str 對比度調整 wikipedia 增加 ray oop 原理

直方圖均衡化是使用圖像直方圖進行對比度調整的圖像處理的方法。

該方法通常會增加許多圖像的整體對比度,尤其是當圖像的可用數據由接近的對比度值表示時。 通過這種調整,強度可以更好地分布在直方圖上。 這允許局部對比度較低的區域獲得較高的對比度。 直方圖均衡化通過有效地分散最頻繁的強度值來實現這一點。

實現原理參考自直方圖均衡(維基百科)

第一種是自己寫的,消耗時間長。第二種參考自opencv-python的直方圖均衡

import cv2
import numpy as np


def equalizationByLoop(img):
    a, b = img.shape
    flatten 
= np.reshape(img, [-1, ]) img_list = flatten.tolist() # 獲取出現的灰度值 img_set = np.unique(img) img_set = np.sort(img_set) # 獲取灰度值出現次數 cdf = [] for i in img_set: cdf.append(img_list.count(i)) cdf = np.array(cdf) # 累積分布函數和計算均衡化 cdf = np.cumsum(cdf) cdf_min
= np.min(cdf) cdf = (cdf-cdf_min)/(len(img_list)-cdf_min)*255 # 獲取新圖像 for x in range(a): for y in range(b): index = np.argwhere(img_set == img[x][y]) img[x][y] = cdf[index] return img def equalizationByNumpy(img): hist, bins = np.histogram(img.flatten(), 256, [0, 256])
# hist是亮度值出現次數的統計 cdf = hist.cumsum() # cdf是出現次數的累積分布函數 # 如果高灰度值沒有次數,但累計分布函數會把它加入。但最後在索引生成新圖像時舍去 # 均衡化處理 cdf_m = np.ma.masked_equal(cdf, 0) cdf_m = (cdf_m - cdf_m.min())*255/(cdf_m.max()-cdf_m.min()) cdf = np.ma.filled(cdf_m, 0).astype(uint8) # 生成新圖像 img2 = cdf[img] return img2 def main(): img = cv2.imread(leno.jpg, cv2.IMREAD_GRAYSCALE) new_img = np.copy(img) # 處理時間長 # new_img = equalizationByLoop(new_img) new_img = equalizationByNumpy(new_img) cv2.imshow(img, img) cv2.imshow(new img, new_img) cv2.waitKey(0) cv2.destroyAllWindows() if __name__ == __main__: main()

灰度直方圖均衡化----python實現