Python - OpenCV 图像二值化处理
? ? ? 圖像二值化處理時圖像處理過程中非常常見的一種操作,在python中比較常用的主要是opencv,pil兩個第三庫,對比來看的話,opencv使用要更加的方便靈活,
文本主要介紹以下基于opencv的圖像二值化處理方法。
? ? ?首先我們來看一種比較簡單的圖像二值化處理方法。
全局閾值二值化
主要思路就是設置一個閾值,低于該閾值的像素置為0(黑色),高于該閾值的像素置為255(白色),下面來看代碼
def image_binarization(img):# 將圖片轉為灰度圖gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# retval, dst = cv2.threshold(gray, 110, 255, cv2.THRESH_BINARY)# 最大類間方差法(大津算法),thresh會被忽略,自動計算一個閾值retval, dst = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)cv2.imwrite('binary.jpg', dst)cv2.threshold(src, thresh, maxval, type)
- src:表示的是圖片源
- thresh:表示的是閾值(分割值)
- maxval:表示的是最大值
- type:表示的是這里劃分的時候使用的是什么類型的算法,包含以下幾種
該函數有兩個返回值,第一個retVal(得到的閾值),第二個就是閾值化后的圖像。
上述方法較為簡單,且運算效率較高,但是存在一個問題,如果你想批量處理一批文本圖片,有的圖片文本較深,有的圖片文本較淺,那么你設置一個單一的閾值就會存在問題,如果閾值較小,那么顏色較淺的文本圖片二值化過后內容會丟失,如果閾值較大,圖片二值化處理后,文本內容很可能和背景融為一體較難區分。
閾值設置為70
? ? ? ? ? ??
? ? ? ? ? ? ? ? ?處理前? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?處理后
閾值設置為110
? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ?處理前? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?處理后
大津算法
cv2.threshold處理上述5種算子之外,還提供了一種可以根據圖片像素自動計算閾值的一種方法,cv2.THRESH_OTSU(最大類間方差法,也叫大津算法),thresh會被忽略,自動計算一個閾值。
?
? ? ? ? ? ? ? ? ? ? ? ? ?處理前? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 處理后?
雖然該算子可以在一定程度上可以解決上述問題,但是該算子對于比較復雜的圖片處理效果還是很不理想,尤其是一些明暗差異較大的圖片,下面記錄一種可以局部自適應的二值化的方法
局部閾值二值化
為了解決我們上述所說的問題,我們可以采用cv2.adaptiveThreshold方法進行二值化處理,函數的大致意思是以圖片中的每個像素點為中心取他周圍n*n的范圍內的像素,然后根據這個區域內的像素值來計算出來一個閾值,決定當前像素點是處理成0還是255。
主要包含以下幾個步驟
1. 加載圖像
2. 轉灰度圖
3. 圖像預處理(根據個人需求進行處理)
4. 二值化處理
5. 降噪(根據個人需求進行處理)
核心函數
cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C, dst=None)src:需要進行二值化的一張灰度圖像
maxValue:滿足條件的像素點需要設置的灰度值。(將要設置的灰度值)
adaptiveMethod:自適應閾值算法。可選ADAPTIVE_THRESH_MEAN_C 或 ADAPTIVE_THRESH_GAUSSIAN_C
thresholdType:opencv提供的二值化方法,只能THRESH_BINARY或者THRESH_BINARY_INV
blockSize:要分成的區域大小,上面的N值,取奇數
C:常數,每個區域計算出的閾值的基礎上在減去這個常數作為這個區域的最終閾值,可以為負數
dst:輸出圖像,可以忽略
? ? ??? ? ?? ? ?
?
總結
以上是生活随笔為你收集整理的Python - OpenCV 图像二值化处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 彻底卸载mysql
- 下一篇: vim替换字符串带斜杠_vim替换命令