【1】引言
前序學習了5種閾值處理方法,包括(反)閾值處理、(反)零值處理和截斷處理,還學習了一種自適應處理方法,相關文章鏈接為:
python學opencv|讀取圖像(三十三)閾值處理-灰度圖像-CSDN博客
python學opencv|讀取圖像(三十四)閾值處理-彩色圖像-CSDN博客
python學opencv|讀取圖像(三十五)反閾值處理-CSDN博客
python學opencv|讀取圖像(三十六)(反)零值處理-CSDN博客
python學opencv|讀取圖像(三十七 )截斷處理-CSDN博客
python學opencv|讀取圖像(三十八 )閾值自適應處理-CSDN博客
在上述所有文章中,閾值開關都是自己隨機設置的,因此,實際效果可能未必是最佳。
如果有一種方法,可以讓函數自動選取最佳閾值開關,那就能時刻獲得最佳的閾值處理效果,這個方法就是:“閾值處理參數+Otsu”。
【2】官網教程
Otsu方法的說明,點擊下方鏈接可以直達:
OpenCV: Miscellaneous Image Transformations
官網頁面關于Otsu方法的說明為:
圖1
實際上,使用Otsu方法時,必須配合前述5種閾值處理方法一起進行閾值調整。因為Otsu方法本身是來輔助選擇最優的閾值開關,所以閾值處理方法還需要保留。
在下述官網示例說明中,我們會看到這一解釋:
import cv2 as cv # 引入CV模塊
import numpy as np #引入numpy模塊# 讀取圖片-直接轉化灰度圖
src = cv.imread('srcf.png',0) #讀取圖像
dst=src#輸出圖像# 讀取圖片-函數轉化灰度圖
src1 = cv.imread('srcf.png') #讀取圖像
dst1=cv.cvtColor(src1,cv.COLOR_BGR2GRAY) #轉化為灰度圖dstt=np.hstack((dst,dst1)) #兩種灰度圖拼接在一起
OpenCV: Image Thresholding
圖2
【3】代碼測試
首先引入必要的模塊和原圖像:
import cv2 as cv # 引入CV模塊
import numpy as np #引入numpy模塊# 讀取圖片-直接轉化灰度圖
src = cv.imread('srcf.png',0) #讀取圖像
dst=src#輸出圖像# 讀取圖片-函數轉化灰度圖
src1 = cv.imread('srcf.png') #讀取圖像
dst1=cv.cvtColor(src1,cv.COLOR_BGR2GRAY) #轉化為灰度圖dstt=np.hstack((dst,dst1)) #兩種灰度圖拼接在一起
然后進行Otsu處理,為進行對比,也做了零值處理:
#閾值處理
t2,dst2=cv.threshold(src,58,158,cv.THRESH_TOZERO) #零值-閾值開關58,閾值上限158
t3,dst3=cv.threshold(src,0,255,cv.THRESH_TOZERO+cv.THRESH_OTSU) #零值+OTSU
dsto=np.hstack((dst2,dst3)) #兩種閾值處理圖拼接在一起
之后顯示圖像和保存圖像:
# 在屏幕展示效果
cv.imshow('srcdstt', dstt) # 在屏幕展示效果
cv.imshow('srcdsto', dsto) # 在屏幕展示效果#顯示BGR值
print("dst1像素數為[100,100]位置處的BGR=", dst1[100, 100]) # 獲取像素數為[100,100]位置處的BGR
print("dst2像素數為[100,100]位置處的BGR=", dst2[100, 100]) # 獲取像素數為[100,100]位置處的BGR
print("dst3像素數為[100,100]位置處的BGR=", dst3[100, 100]) # 獲取像素數為[100,100]位置處的BGR#保存圖像
cv.imwrite('srcf-dstt.png', dstt) # 保存圖像
cv.imwrite('srcf-dst2.png', dst3) # 保存圖像
cv.imwrite('srcf-dsto.png', dsto) # 保存圖像cv.waitKey() # 圖像不會自動關閉
cv.destroyAllWindows() # 釋放所有窗口
此處使用的原始圖像為:
圖3
轉化后的灰度圖為:
圖4 灰度圖
進行單純零值處理和零值處理+OTSU處理后的圖像為:
圖5 單純零值處理和零值處理+OTSU處理
由圖5可見,右側為零值處理+OTSU處理后的圖像,更趨向于突出輪廓邊線。
由于OTSU處理圖像會自動選擇最佳閾值開關,所以我們輸出了特定位置的BGR值:
圖6 特定像素點BGR值
dst1為轉后的原始灰度圖,dst2為單純零值處理圖,dst3為零值處理+OTSU處理后的圖像。
由圖6可見,零值處理+OTSU處理后的圖像,自動選擇的閾值開關也沒有超過156,所以這兩個圖在像素點[100][100]處的BGR值完全相等。
【4】細節說明
使用Otsu方法的時候,依然調用cv2.threshold()函數,雖然此時Otsu會自動選擇閾值開關,但仍然需要在閾值開關的位置寫"0"。
圖7 提前設定閾值開關為0
【5】總結
掌握了python+opencv實現Otsu自動調整閾值開關的操作技巧。
?
?