參看博客:
1.http://www.cnblogs.com/tianyalu/p/5687782.html
2.https://blog.csdn.net/zmdsjtu/article/details/77993135
3.https://blog.csdn.net/u010839382/article/details/49584181 (詳細解釋了CLAHE的原理,很有用)
HE: histogram equalization 直方圖均衡化
AHE: adapative histogram equalization 自適應直方圖均衡化, 加了分塊而已。
CLAHE: contrast-limited adapative histogram equalization 對比度受限的自適應直方圖均衡化, 可用性最好。
直方圖均衡化的作用是圖像增強。
有兩個問題比較難懂,一是為什么要選用累積分布函數,二是為什么使用累積分布函數處理后像素值會均勻分布。
第一個問題。均衡化過程中,必須要保證兩個條件:
①像素無論怎么映射,一定要保證原來的大小關系不變,較亮的區域,依舊是較亮的,較暗依舊暗,只是對比度增大,絕對不能明暗顛倒;
②如果是八位圖像,那么像素映射函數的值域應在0和255之間的,不能越界。
綜合以上兩個條件,累積分布函數是個好的選擇,因為累積分布函數是單調增函數(控制大小關系),並且值域是0到1(控制越界問題),所以直方圖均衡化中使用的是累積分布函數。
第二個問題。累積分布函數具有一些好的性質,那么如何運用累積分布函數使得直方圖均衡化?比較概率分布函數和累積分布函數,前者的二維圖像是參差不齊的,后者是單調遞增的。直方圖均衡化過程中,映射方法是
其中,n是圖像中像素的總和,是當前灰度級的像素個數,L是圖像中可能的灰度級總數。
來看看通過上述公式怎樣實現的拉伸。假設有如下圖像:
得圖像的統計信息如下圖所示,並根據統計信息完成灰度值映射:
映射后的圖像如下所示:
CLAHE原理:通過改變直方圖中超過cliplimit值的個數,來達到平滑直方圖的目的。
關鍵的是,如何把一個頻數非常高的對應像素值的點,改成其他頻數較少像素值的點?
附代碼:
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
def equalHist_demo(image):
'''全局直方圖的圖像增強'''
gray=cv.cvtColor(image,cv.COLOR_BGR2GRAY)#圖像增強必須要轉灰度圖
dst=cv.equalizeHist(gray) #全局直方圖,整體進行圖像增強,可能會壞事,不夠靈活
cv.imshow('equalizeHist',dst)
def clahe_demo(image):
'''局部直方圖的圖像增強'''
# gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY) # 圖像增強必須要轉灰度圖
gray=image
clahe= cv.createCLAHE(clipLimit=2.0,tileGridSize=(8,8)) #定義CLAHE
dst=clahe.apply(gray)
cv.imshow('CLAHE', dst)
src=cv.imread('D:/pycharm/pycharmproject/test.jpg')
src=cv.cvtColor(src,cv.COLOR_BGR2GRAY)
cv.imshow('src',src)
# equalHist_demo(src)
clahe_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()