固定閾值分割很直接,一句話說就是畫素點值大於閾值乙個值,小於閾值是另外乙個值。
# 灰度圖讀入
# 閾值分割
ret, th = cv2.threshold(img, 127, 255, cv2.thresh_binary)
cv2.imshow('thresh', th)
cv2.waitkey(0)
cv2.threshold()
用來實現閾值分割,ret是return value縮寫,代表當前的閾值,暫時不用理會。函式有4個引數:
# 應用5種不同的閾值方法
ret, th1 = cv2.threshold(img, 127, 255, cv2.thresh_binary)
ret, th2 = cv2.threshold(img, 127, 255, cv2.thresh_binary_inv)
ret, th3 = cv2.threshold(img, 127, 255, cv2.thresh_trunc)
ret, th4 = cv2.threshold(img, 127, 255, cv2.thresh_tozero)
ret, th5 = cv2.threshold(img, 127, 255, cv2.thresh_tozero_inv)
titles = ['original', 'binary', 'binary_inv', 'trunc', 'tozero', 'tozero_inv']
images = [img, th1, th2, th3, th4, th5]
# 使用matplotlib顯示
for i in range(6):
plt.subplot(2, 3, i + 1)
plt.imshow(images[i], 'gray')
plt.title(titles[i], fontsize=8)
plt.xticks(), plt.yticks() # 隱藏座標軸
5種不同的閾值方式結果
結合下表,就很容易理解這5種方式了:
經驗之談:很多人誤以為閾值分割就是二值化。從上圖中可以發現,兩者並不等同,閾值分割結果是兩種值,而不是兩個值,所以教程開頭我把二值化加了引號
[上傳失敗...(image-29853f-1515133023073)]
看得出來固定閾值是在整幅上應用乙個閾值進行分割,它並不適用於明暗分布不均的。cv2.adaptivethreshold()
自適應閾值會每次取的一小部分計算閾值,這樣不同區域的閾值就不盡相同。它有5個引數,其實很好理解,先看下效果:
# 自適應閾值對比固定閾值
# 固定閾值
ret, th1 = cv2.threshold(img, 127, 255, cv2.thresh_binary)
# 自適應閾值
自適應閾值對比固定閾值
引數4:閾值方式(跟前面講的那5種相同)
引數5:小區域的面積,如11就是11*11的小塊
引數6:最終閾值等於小區域計算出的閾值再減去此值
如果你沒看懂上面的引數也不要緊,暫時會用就行,當然我建議你調整下引數看看不同的結果。
在前面固定閾值中,我們是隨便選了乙個閾值如127,那如何知道我們選的這個閾值效果好不好呢?答案是:不斷嘗試,所以這種方法在很多文獻中都被稱為經驗閾值。otsu閾值法就提供了一種自動高效的二值化方法,不過我們直方圖還沒學,這裡暫時略過。
好吧,我知道我激起了你的興趣,~ o( ̄▽ ̄)o,有能力的童鞋可以看下練習題。
otsu閾值是一種高效的二值化演算法,請嘗試閱讀番外篇:otsu閾值法
python OpenCV基礎入門教程
opencv 是乙個開源的計算機視覺庫,可以在opencv 獲取。opencv 設計用於進行高效的計算,十分強調實時應用的開發。它由 c 語言編寫並進行了深度優化,從而可以享受多執行緒處理的優勢。opencv 的乙個目標是提供易於使用的計算機視覺介面,從而幫助人們快速建立精巧的視覺應用。opencv...
Python OpenCV實時風格化教程
教程如下,來自作者crossin 每次在mac跑乙個demo都要歷經很多bug 首先按照文章裡的介紹將資源都下好,然後在終端執行 sh download style transfer models.sh 將其餘的訓練好的模型都下下來。然後在pycharm中執行 會報錯 module cv2.dnn ...
實驗6 Python OpenCV寬度測量
your browser does not support the audio element.測量所給的高度,即上下邊緣間的距離。思路 將進行閾值操作得到二值化。擷取只包含上下邊框的部分,以便於後續的輪廓提取 輪廓檢測 得到結果 1.用於給新增中文字元 用於給新增中文字元 def imgtext ...