python-opencv中的cv2.inRange函數用法說明
本次目標是將一副圖像從rgb顏色空間轉換到hsv顏色空間,顏色去除白色背景部分
具體就調用瞭cv2的兩個函數,一個是rgb轉hsv的函數
具體用法
hsv = cv2.cvtColor(rgb_image, cv2.COLOR_BGR2HSV)
然後利用cv2.inRange函數設閾值,去除背景部分
mask = cv2.inRange(hsv, lower_red, upper_red) #lower20===>0,upper200==>0,
函數很簡單,參數有三個
第一個參數:hsv指的是原圖
第二個參數:lower_red指的是圖像中低於這個lower_red的值,圖像值變為0
第三個參數:upper_red指的是圖像中高於這個upper_red的值,圖像值變為0
而在lower_red~upper_red之間的值變成255
lower_red = np.array([20, 20, 20]) upper_red = np.array([200, 200, 200]) mask = cv2.inRange(hsv, lower_red, upper_red) #lower20===>0,upper200==>0,lower~upper==>255
就是將低於lower_red和高於upper_red的部分分別變成0,lower_red~upper_red之間的值變成255
具體用法如下
hsv = cv2.cvtColor(rgb_image, cv2.COLOR_BGR2HSV) lower_red = np.array([20, 20, 20]) upper_red = np.array([200, 200, 200]) # mask -> 1 channel mask = cv2.inRange(hsv, lower_red, upper_red) #lower20===>0,upper200==>0
補充:色彩閥值化處理——openCV-python中inRange()等相關函數實測
色彩閥值化
在圖像處理的過程中,使用各種形態學操作或者濾波的方式來突顯我們關註的元素,同時降低噪聲並減少幹擾我們提取關鍵元素的影響項。除瞭這些方法外,我們可以在原圖中先依據顏色的特征,提取出更為關鍵的像素。就像車道檢測時,一般車道隻有兩種顏色:黃色和白色。所以我們可以在 RGB 色彩空間(Color Space) 對這兩種顏色進行過濾從而提取出車道線的像素。
色彩空間:使用一組值(通常使用三個、四個值或者顏色成分)表示顏色方法的抽象數學模型。有利用原色相混的比例表示的色彩空間,如 RGB (Red, Green, Blue) 顏色空間; 也有利用不同的概念表示的色彩空間,如 HSV (色相 hue, 飽和度 saturation, 明度 value) 以及 HSL (色相 hue,飽和度 saturation,亮度 lightness/luminance) 。
在OpenCV中,RGB三通道的圖像的讀取 cv2.imread() 的結果是以 BGR 順序排列的,而在使用matplotlib的 plt.imread() 時, 讀取的通道排列順序則為 RGB 。因此此處應當註意區別。
openCV中cv2.inRange()函數是實現該功能的關鍵,我們先看看官網對該函數的定義:
dst = cv.inRange( src, lowerb, upperb[, dst] )
檢測數組元素是否位於其他兩個元素之間。
該函數檢測范圍方式如下:
對於單通道輸入的每個元素:
對於雙通道輸入:
同樣應用於四通道
也就是說,如果src (I)在指定的1D, 2D, 3D,…框內則dst(I)為255,否則為0。當下邊界和/或上邊界參數為標量時,應省略上述公式中在上、下邊界處的索引(I)。
各參數詳細含義:
src 輸入的數組
lowerb 下邊界數組或標量.
upperb 上邊界數組或標量.
dst 與src和CV_8U類型大小相同的輸出數組。
接下來將結合簡單的例子通過python更好地理解這個函數:
import matplotlib.pyplot as plt import numpy as np import cv2 # 對圖片進行讀取 img_cv2 = cv2.imread('D:\\test\\CVtest.jpg') print(img_cv2)
為瞭方便理解,我用畫板工具畫瞭一個5×5像素點的紅色圖片。上述代碼運行結果為:
[[[ 36 27 237] [ 36 27 237] [ 36 27 237] [ 36 27 237] [ 36 27 237]] [[ 36 27 237] [ 36 27 237] [ 36 27 237] [ 36 27 237] [ 36 27 237]] [[ 36 27 237] [ 36 27 237] [ 36 27 237] [ 36 27 237] [ 36 27 237]] [[ 36 27 237] [ 36 27 237] [ 36 27 237] [ 36 27 237] [ 36 27 237]] [[ 36 27 237] [ 36 27 237] [ 36 27 237] [ 36 27 237] [ 36 27 237]]]
讀者可以自行測試一下,B=36,G=27,R=237為紅色。
# 創建RGB色彩空間 color_Low1 = np.array([30,27,237]) color_Low2 = np.array([39,27,237]) color_High = np.array([40,27,237]) # 對圖片進行閥值化處理 img_dst1 = cv2.inRange(img_cv2,color_Low1,color_High) img_dst2 = cv2.inRange(img_cv2,color_Low2,color_High) #對結果進行打印 print(img_dst1,'\n', img_dst2) # 運行結果分別為 [[255 255 255 255 255] [255 255 255 255 255] [255 255 255 255 255] [255 255 255 255 255] [255 255 255 255 255]] [[0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0]]
可以看出,當圖片中的像素點落在色彩空間時,輸出結果全是255,當像素點不落在色彩空間是,輸出結果全是0。對最終結果進行顯示:
#對圖像進行展示 cv2.imshow("origin_img",img_cv2) cv2.imshow("dst_img1",img_dst1) cv2.imshow("dst_img2",img_dst2) cv2.waitKey(0) cv2.destroyAllWindows()
最終結果為一個紅色、一個黑色的、一個白色的小點。
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。如有錯誤或未考慮完全的地方,望不吝賜教。
推薦閱讀:
- 使用python和opencv的mask實現摳圖疊加
- Python+OpenCV實現基於顏色的目標識別
- python利用opencv實現顏色檢測
- Python+OpenCV數字圖像處理之ROI區域的提取
- OpenCV實現對象跟蹤的方法