一、圖像二值化——inRange()
inRange的語法如下
dst = inRange(src, upper, lower)
- src是圖像數據
- upper可以是單個數值,也可以是與src相同大小的數組,代表篩選范圍最高邊界
- lower可以是單個數值,也可以是與src相同大小的數組,代表篩選范圍最低邊界
- dst既可以寫進圓括號內,也可以作為函數的返回值被接收
API運行原理
如果圖像中的像素點數值在upper和lower定義的范圍之內,就在像素點所在位置返回255;反之不在范圍內就返回0。
二、提取特定顏色——inRange()
第一部分講了inRange()的工作原理,現在我們講講它的應用案例——提取圖像特定顏色,比如提取出圖像中的綠色。
我們需要知道綠色的三個通道各自取值范圍,網上有些文章已經總結了每一種顏色的各通道取值區間,舉個例子【OpenCV】HSV顏色識別-HSV基本顏色分量范圍 - 騰訊雲開發者社區。
我們可以發現,基本上在顏色空間HSV中,這樣的取值范圍才有意義;所以我們還需要用cvtColor()將其他顏色空間轉換成HSV顏色空間。
從表中我們可以看出綠色的最小邊界是[35, 43, 46],最大邊界是[77, 255, 255]。
因此我們可以寫成dst = inRange(src, np.array([35, 43, 46]), np.array([77, 255, 255])),來提取圖像src中的綠色區域,再執行src[dst==0] = 0後,得到的圖像除了綠色區域,其他部分都是黑色。
三、圖像阈值處理——threshold()
參考官方API文檔:OpenCV: Miscellaneous Image Transformations-Threshold()
圖像阈值處理是圖像二值化中的一種方法,圖像二值化不是說最後得到的像素值是0和1(倘若真的是0和1,顏色是全黑,顯然非此)。
直接給出API的語法格式。
cv.threshold(src, thresh, maxval, type[, dst]) ->retval, dst
- src是圖像;雖然可以傳入多通道彩圖(這時候對各個通道單獨進行阈值處理),但不建議,灰度圖才是最適合阈值處理的。
- thresh是阈值;如果像素值大於阈值就取maxval,否則取0;如果type中設置了自動獲取阈值的flag(cv.THRESH_OTSU和cv.THRESH_TRIANGLE),那麼thresh一般設置成255,這時不起任何作用。
- maxval是最大填充值;最後得到的圖像像素值只有兩個,如果type是cv.THRESH_BINARY和cv.THRESH_BINARY_INV時,才會用到maxval,小的填充值是0,而大的填充值是maxval,一般設定成255(灰度圖——>白色)。
- type有很多種,用來指定阈值化處理的類型;如果是二值化阈值處理就是cv.THRESH_BINARY和cv.THRESH_BINARY_INV,如果是截斷阈值處理就是cv.THRESH_TRUNC,如果是趨零阈值處理就是cv.THRESH_TOZERO和cv.THRESH_TOZERO_INV;此外還可以設置是否自動獲取阈值,對應的flag是cv.THRESH_OTSU和cv.THRESH_TRIANGLE,對應兩種自動獲取阈值的算法;上面提到的最後兩種type只能任選一個,同樣前面五種type也只能任選一個,一個正確的示例type=cv.THRESH_BINARY | cv.THRESH_OTSU,當然豎槓號也可換成加號。
- retval是返回值,如果非自動獲取阈值,最後的retval和設定的thresh相等,而如果是自動獲取阈值,返回的是使用自動獲取阈值算法得到的阈值。
- dst也即阈值化處理後的圖像結果。