一、引言
在前面的如下幾篇文章中:
- 《數字影像處理》第三章學習總結感悟2-1:直方圖均衡處理
- 數字影像處理:區域直方圖處理(Local Histogram Processing)
- 數字影像處理:使用直方圖統計進行影像增強
- OpenCV-Python影像直方圖計算詳解、示例及圖形呈現
- 數字影像處理:OpenCV-Python中的直方圖均衡知識介紹及函式equalizeHist詳解
老猿分別介紹了數字影像直方圖處理相關的原理和概念以及應用案例,并提供了全域直方圖均衡處理的OpenCV-Python的實作演算法以及支持函式,但老猿并沒有找到區域直方圖處理、使用直方圖統計資訊單獨的OpenCV函式,與此相關的一個OpenCV概念就是CLAHE(Contrast Limited Adaptive Histogram Equalization,對比度受限的自適應直方圖均衡),這個概念老猿認為涵蓋了區域直方圖均衡處理和基于直方圖統計資訊進行影像增強的部分內容,下面就來介紹與此相關的知識,
二、CLAHE概念
全域直方圖均衡,考慮的是影像的整體對比度,正如區域直方圖處理介紹的那樣,對大多數影像來說這并不是個好主意,當影像中同時存在亮區域范圍和暗區域范圍灰度值變化比較大的情況時,全域直方圖的效果并不好,下面的一張書房影像除了雕像外整體偏暗,經全域直方圖均衡后雖然整體對比度得到了改善,但雕像由于亮度過高在均衡后卻反而丟失了大多數的資訊,

為了解決這個問題,使用了自適應直方圖均衡( Adaptive Histogram Equalization),CLAHE,對比度受限的自適應直方圖均衡,英文全稱Contrast Limited Adaptive Histogram Equalization,OpenCV推出CLAHE,就是在結合區域的對比度統計資訊進行限定來實作區域直方圖均衡,
在這種情況下,影像被分成稱為“tiles”(瓷磚、地磚、小方地毯、片狀材料、塊狀材料)的小塊,在OpenCV中,tileSize默認為8x8 ,然后對分開的子影像逐一進行直方圖均衡,這樣在這些較小的子影像區域中,直方圖將限制在一個較小的區域中(除非存在噪聲),
老猿注:tiles才開始以為是分塊的每塊的行列像素多少,后來仔細研究演算法才發現這是影像被分成了橫向和縱向各多少塊,如8×8就是整個影像被劃分為8縱8橫共64塊,不過根據看到的演算法而言,影像的像素的行數和列數必須能分別整除tiles的縱向和橫向塊數,如果不能整除的怎么處理尚未弄明白,
如果影像中有噪音,噪音將被放大(amplified),為了避免這種情況,應用了對比度限制(contrast limiting),如果任何直方圖bin超出指定的對比度限制(在OpenCV中默認為40),則在應用直方圖均衡之前,將這些像素裁剪(clipped )并均勻地分布(distributed uniformly)到其他bin,均衡后,要消除圖塊邊界中的偽影(artifacts),則需要應用雙線性插值(bilinear interpolation ),
老猿注:
- 對比度限制這個引數是用每塊子影像直方圖的每個bins的像素數和整影像素按所有灰度平均數的比值來限制的;
- 裁剪則是將每塊影像直方圖中超過對比度限制bins多出的灰度像素數去除超出部分,然后將所有bins超出的像素數累加后平均分配到所有bins;
- 關于具體演算法將在老猿近期研究清楚后的后續演算法及模擬實作的博文中介紹,
三、OpenCV中的CLAHE支持
關于OpenCV中的CLAHE的支持,請參考《OpenCV-Python自適應直方圖均衡類CLAHE及方法詳解 》(鏈接:https://blog.csdn.net/LaoYuanPython/article/details/120850922)的介紹,
下面的代碼片段顯示了如何在OpenCV中應用CLAHE以及其效果:
import numpy as np
import cv2 as cv
img = cv.imread('tsukuba_l.png',0)
# create a CLAHE object (Arguments are optional).
clahe = cv.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
cl1 = clahe.apply(img)
cv.imwrite('clahe_2.jpg',cl1)
查看下面的結果,并將其與上面的結果進行比較,尤其是雕像區域:

四、CLAHE的測驗
下面的代碼加載兩個經典直方圖均衡的案例影像,使用不同的clipLimit值進行處理,看最終的處理效果,
4.1、測驗源代碼
from opencvPublic import preparePreviewImg,previewImgList,readImgFile
import cv2
def testLocalHistEqu():
img1 = readImgFile(r'f:\pic\valley.png', True)
img2 = readImgFile(r'f:\pic\火星衛星.JPG', True)
imgEqu1G = cv2.equalizeHist(img1)
imgEqu2G = cv2.equalizeHist(img2)
clahe = cv2.createCLAHE(clipLimit=4, tileGridSize=(8, 8))
imgEqu1A4 = clahe.apply(img1)
imgEqu2A4 = clahe.apply(img2)
clahe.setClipLimit(40)
imgEqu1A40 = clahe.apply(img1)
imgEqu2A40 = clahe.apply(img2)
clahe.setClipLimit(100)
imgEqu1A100 = clahe.apply(img1)
imgEqu2A100 = clahe.apply(img2)
preparePreviewImg('輸入影像:山谷', img1, fontSize=38, color=(255, 0, 0))
preparePreviewImg('全均衡效果', imgEqu1G, fontSize=38, color=(255, 0, 0))
preparePreviewImg('自適應均衡效果:CL=4', imgEqu1A4, fontSize=38, color=(255, 0, 0))
preparePreviewImg('自適應均衡效果:CL=40', imgEqu1A40, fontSize=38, color=(255, 0, 0))
preparePreviewImg('自適應均衡效果:CL=100', imgEqu1A100, fontSize=38, color=(255, 0, 0))
preparePreviewImg('https://blog.csdn.net/LaoYuanPython', None, fontSize=38, color=(255, 0, 0))
preparePreviewImg('輸入影像:火星衛星', img2, fontSize=38, color=(255, 0, 0))
preparePreviewImg('全均衡效果', imgEqu2G, fontSize=38, color=(255, 0, 0))
preparePreviewImg('https://blog.csdn.net/LaoYuanPython', None, fontSize=38, color=(255, 0, 0))
preparePreviewImg('自適應均衡效果:CL=4', imgEqu2A4, fontSize=38, color=(255, 0, 0))
preparePreviewImg('自適應均衡效果:CL=40', imgEqu2A40, fontSize=38, color=(255, 0, 0))
preparePreviewImg('https://blog.csdn.net/LaoYuanPython', None, fontSize=38, color=(255, 0, 0))
preparePreviewImg('自適應均衡效果:CL=100', imgEqu2A100, fontSize=38, color=(255, 0, 0))
previewImgList()
print('\033[31m老猿Python網址:\033[34mhttps://blog.csdn.net/LaoYuanPython\033[0m,同名微信公眾號:\033[34m老猿Python')
testLocalHistEqu()
以上代碼中,opencvPublic是老猿常用的影像處理自定義方法的公用模塊,本文使用的自定義公用模塊函式preparePreviewImg,previewImgList,readImgFile,cmpMatrix,print2DMatrix,其功能請參考《 OpenCV-Python圖形影像處理:自用的一些工具函式功能及呼叫語法介紹》(https://blog.csdn.net/LaoYuanPython/article/details/111351901)中的介紹,
4.2、輸出影像

從上述影像結果可以看到:
1、對比度受限的自適應直方圖均衡與全域直方圖相比,對于暗區域的改善效果更好;
2、clipLimit值越大,暗區域的改善效果越明顯,但亮區域反而變模糊了,
五、小結
本文介紹了OpenCV-Python對比度受限的自適應直方圖均衡CLAHE相關知識,可以看到CLAHE比全域直方圖均衡對明暗分布不均勻的影像的改善效果更好,而進行CLAHE處理時,clipLimit值越大,對暗區域的改善效果越明顯,但亮區域反而會起到反作用,
如對文章內容存在疑問,可在博客評論區留言,或關注博客左邊的:老猿Python 微信公號發訊息咨詢,
寫博不易,敬請支持:
如果閱讀本文于您有所獲,敬請點贊、評論、收藏,謝謝大家的支持!
關于老猿的付費專欄
- 付費專欄《https://blog.csdn.net/laoyuanpython/category_9607725.html 使用PyQt開發圖形界面Python應用》專門介紹基于Python的PyQt圖形界面開發基礎教程,對應文章目錄為《 https://blog.csdn.net/LaoYuanPython/article/details/107580932 使用PyQt開發圖形界面Python應用專欄目錄》;
- 付費專欄《https://blog.csdn.net/laoyuanpython/category_10232926.html moviepy音視頻開發專欄 )詳細介紹moviepy音視頻剪輯合成處理的類相關方法及使用相關方法進行相關剪輯合成場景的處理,對應文章目錄為《https://blog.csdn.net/LaoYuanPython/article/details/107574583 moviepy音視頻開發專欄文章目錄》;
- 付費專欄《https://blog.csdn.net/laoyuanpython/category_10581071.html OpenCV-Python初學者疑難問題集》為《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python圖形影像處理 》的伴生專欄,是筆者對OpenCV-Python圖形影像處理學習中遇到的一些問題個人感悟的整合,相關資料基本上都是老猿反復研究的成果,有助于OpenCV-Python初學者比較深入地理解OpenCV,對應文章目錄為《https://blog.csdn.net/LaoYuanPython/article/details/109713407 OpenCV-Python初學者疑難問題集專欄目錄 》
- 付費專欄《https://blog.csdn.net/laoyuanpython/category_10762553.html Python爬蟲入門 》站在一個互聯網前端開發小白的角度介紹爬蟲開發應知應會內容,包括爬蟲入門的基礎知識,以及爬取CSDN文章資訊、博主資訊、給文章點贊、評論等實戰內容,
前兩個專欄都適合有一定Python基礎但無相關知識的小白讀者學習,第三個專欄請大家結合《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python圖形影像處理 》的學習使用,
對于缺乏Python基礎的同仁,可以通過老猿的免費專欄《https://blog.csdn.net/laoyuanpython/category_9831699.html 專欄:Python基礎教程目錄)從零開始學習Python,
如果有興趣也愿意支持老猿的讀者,歡迎購買付費專欄,
老猿Python,跟老猿學Python!
? ? 前往老猿Python博文目錄 https://blog.csdn.net/LaoYuanPython ?
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/335333.html
標籤:其他
上一篇:基于SRGAN的影像超解析度實體
下一篇:傳統目標檢測方法研究(一)
