OpenCV-Python入門教程5-閾值分割

1、固定閾值分割

import cv2 import matplotlib.pyplot as plt
# 灰度圖讀入
img = cv2.imread('gradient.jpg', 0) # 閾值分割
ret, th = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY) cv2.imshow('thresh', th) cv2.waitKey(0)

cv2.threshold()用來實現閾值分割,有4個參數:html

  • 參數1:要處理的原圖,通常是灰度圖
  • 參數2:設定的閾值
  • 參數3:最大閾值,通常是255
  • 參數4:閾值的方式,主要有5種,詳情:ThresholdTypes

理解這5種閾值方式:url

# 應用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([]) # 隱藏座標軸
plt.show()

固定閾值將整幅圖片分紅兩類值,它並不適用於明暗分佈不均的圖片。而cv2.adaptiveThreshold()自適應閾值會每次取圖片的一小部分計算閾值。這樣圖片不一樣區域的閾值就不盡相同。spa

2、自適應矩陣

# 自適應閾值對比固定閾值
img = cv2.imread('sudoku.jpg', 0) # 固定閾值
ret, th1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY) # 自適應閾值
th2 = cv2.adaptiveThreshold( img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 4) th3 = cv2.adaptiveThreshold( img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 17, 6) titles = ['Original', 'Global(v = 127)', 'Adaptive Mean', 'Adaptve Gaussian'] images = [img, th1, th2, th3] for i in range(4): plt.subplot(2, 2, i + 1), plt.imshow(images[i], 'gray') plt.title(titles[i], fontsize=8) plt.xticks([]), plt.yticks([]) # 隱藏座標軸
plt.show()

cv2.adaptiveThreshold()的6個參數:.net

  • 參數1:要處理的原圖
  • 參數2:最大閾值,通常爲255
  • 參數3:小區域閾值的計算方式

    ADAPTIVE_THRESH_MEAN_C:小區域內取均值code

    ADAPTIVE_THRESH_GAUSSIAN_C:小區域內加權求和,權重是高斯核htm

  • 參數4:閾值方式(上面提到的那5種)
  • 參數5:小區域的面積,如11就是11 * 11的小塊
  • 參數6:最終閾值等於小區域計算出的閾值再減去此值

咱們前面固定閾值的時候使用了127,那怎麼知道這個閾值好很差呢?這個須要不斷的嘗試,在不少文獻中在特定的場景下有經驗閾值。Otsu閾值法就提供了一種自動高效的二值化方法。我將在下一篇提到。blog

3、小結

cv2.threshold()用來進行固定閾值分割,固定閾值分割不適用於光線不均勻的圖片,因此用cv2.adaptiveThreshold()進行自適應閾值分割。固然,對於不一樣圖片能夠採用的不一樣的閾值分割方法。圖片

相關文章
相關標籤/搜索