一、引言
對比度受限的自適應直方圖均衡在OpenCV中是通過類CLAHE來提供實作的,老猿沒研究過C++中的應用,但OpenCV-Python中應用時與普通的Python類構建物件的機制有所不同,老猿做了相關測驗,在此簡單介紹一下,
二、CLAHE類及方法介紹
2.1、簡介
CLAHE類是OpenCV中進行對比度受限的自適應直方圖均衡的基類,其類繼承關系如下:

其父類和子類老猿沒有研究過,在此就不展開介紹,
該類有2個重要屬性:
- tilesGridSize:影像被分成稱為“tiles”(瓷磚、地磚、小方地毯、片狀材料、塊狀材料)的小塊,在OpenCV中,tilesGridSize默認為8x8 ,即整個影像被劃分為8縱8橫共64塊,然后對每一個塊進行直方圖均衡處理
- clipLimit:裁剪限制,此值與對比度受限相對應,對比度限制這個引數是用每塊的直方圖的每個bins的數和整圖的平均灰度分布數的比值來限制的, 裁剪則是將每塊影像直方圖中超過ClipLimit的bins多出的灰度像素數去除超出部分,然后將所有bins超出的像素數累加后平均分配到所有bins,具體演算法老猿將在研究清楚后單獨介紹,
2.2、成員方法簡介
2.2.1、apply方法
apply方法用于對影像應用對比度受限自適應直方圖均衡變換處理,
呼叫語法: dst = cv.CLAHE.apply( src[, dst] )
引數說明:
- src:輸入影像,影像型別為CV_8UC1 or CV_16UC1,即8位或16位灰度圖
- dst:輸出影像,型別同輸入影像
補充說明:在進行該方法呼叫前,必須已經設定了對比度受限自適應直方圖均衡演算法的受限對比度ClipLimit以及影像分塊的行數和列數tiles
2.2.2、collectGarbage方法
collectGarbage方法應該是進行記憶體垃圾回收的,沒有引數和回傳值,老猿認為由于Python的記憶體管理機制,該方法沒有什么意義,同時測驗沒有發現執行該方法起何作用,因此很可能是個無用的方法,
2.2.3、getClipLimit方法
getClipLimit方法是用于獲取當前CLAHE物件設定的ClipLimit值回傳,
呼叫語法: retval = cv.CLAHE.getClipLimit()
2.2.4、getTilesGridSize方法
getClipLimit方法是用于獲取當前CLAHE物件設定的tilesGridSize回傳,
呼叫語法: retval = cv.CLAHE.getTilesGridSize()
2.2.5、setClipLimit方法
方法是用于設定當前CLAHE物件的ClipLimit值,無回傳值,
呼叫語法: None = cv.CLAHE.setClipLimit( clipLimit )
2.2.6、setTilesGridSize方法
方法是用于設定當前CLAHE物件的tilesGridSize值,無回傳值,
呼叫語法: None = cv.CLAHE.setTilesGridSize( tileGridSize )
三、CLAHE物件的構建
3.1、CLAHE構造方法研究
從上面的方法介紹中,沒有看到CLAHE的構造方法,在OpenCV檔案中,確實沒有這個CLAHE的構造方法,在Python的CLAHE.py模塊中,有該類的構造方法的定義:
def __init__(self, *args, **kwargs): # real signature unknown
pass
沒有任何引數的說明,在老猿找到的該類的C++類的構造方法如下:
int CLAHE(kz_pixel_t* pImage, unsigned int uiXRes, nsigned int uiYRes, kz_pixel_t Min, kz_pixel_t Max, unsigned int uiNrX, unsigned int uiNrY, unsigned int uiNrBins, float fCliplimit);
老猿以C++構造方法為依據構建了Python中的CLAHE類,構造方法確實回傳了CLAHE物件,但以此呼叫相關方法全部出現代碼例外退出,基本上說明OpenCV-Python中CLAHE的構造方法不可用,至于C++中是否能使用,老猿沒有去研究,
3.2、createCLAHE函式
由于OpenCV-Python中CLAHE的構造方法無法使用,同時在OpenCV中,提供了單獨的全域函式createCLAHE,因此OpenCV-Python中CLAHE物件的構建必須通過createCLAHE函式,
呼叫語法:retval = cv.createCLAHE( clipLimit=40,tileGridSize=(8,8))
引數及回傳值說明:clipLimit、tileGridSize請參考前面關于類的介紹,回傳值為創建的類物件,該物件的clipLimit、tileGridSize由createCLAHE函式的引數指定,
四、示例代碼
下面的代碼使用OpenCV-Python對讀入的影像進行對比度受限自適應直方圖均衡處理:
import cv2
def testLocalHistEqu():
img = readImgFile(r'f:\pic\valley.png', True)
print('\033[31m老猿Python網址:\033[34mhttps://blog.csdn.net/LaoYuanPython\033[0m,同名微信公眾號:\033[34m老猿Python')
clahe = cv2.createCLAHE(clipLimit=200, tileGridSize=(5, 5))
cl2 = clahe.getClipLimit()
clahe.setClipLimit(20)
cl1 = clahe.getClipLimit()
clahe.setTilesGridSize((8,8))
imgEquA = clahe.apply(img)
上面的代碼中創建CLAHE物件后,對物件的屬性進行了讀寫操作,其實這些代碼完全沒有必要,
五、小結
本文介紹了OpenCV-Python對比度受限自適應直方圖均衡變換的CLAHE類及其方法,并通過代碼介紹了相關方法的使用,在單影像的對比度受限自適應直方圖均衡時,只需要使用createCLAHE創建CLAHE物件,然后呼叫該物件apply方法就可以完成對比度受限自適應直方圖均衡處理,該類的其他方法用處不大,但如果是要進行多次對比度受限自適應直方圖均衡處理,且需要設定不同的分塊數和受限閾值,則可以通過提供的方法直接修改物件屬性再進行均衡處理即可,
更多影像直方圖處理的內容請參考《《數字影像處理》第三章學習總結感悟2:直方圖處理》的介紹,
更多影像處理的內容請參考專欄《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python圖形影像處理 》、《https://blog.csdn.net/laoyuanpython/category_10581071.html OpenCV-Python初學者疑難問題集》及《影像處理基礎知識》的介紹,
如對文章內容存在疑問,可在博客評論區留言,或關注博客左邊的:老猿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/332195.html
標籤:其他
