基于opencv python 的网线线序识别(三)
4.3?顏色分離模塊
?4.3.1顏色空間
顏色空間又名彩色空間,在對物體進行顏色識別時,選擇合適的顏色空間很重要。常用的顏色空間模型有RGB、YUV、HSV、CMY和HSI等,其中最基本而且最常見的顏色空間為RGB顏色空間。該文主要使用RGB和HSV2個顏色空間模型來研究電線的顏色識別。
RGB分別代表光譜的三原色,即紅、綠、藍,RGB顏色空間不僅易于映入其他顏色空間中,而且可以與它們相互轉換,易受光線影響、不直觀性、且3個顏色分量相互關聯是RGB顏色空間的缺點所在。RGB顏色空間的三維模型如下圖
HSV(Hue, Saturation, Value)是根據顏色的直觀特性由A. R. Smith在1978年創建的一種顏色空間, 也稱六角錐體模型(Hexcone Model)。
這個模型中顏色的參數分別是:色調(H),飽和度(S),明度(V)。
色調H:用角度度量,取值范圍為0°~360°,從紅色開始按逆時針方向計算,紅色為0°,綠色為120°,藍色為240°。它們的補色是:黃色為60°,青色為180°,品紅為300°;
飽和度S:表示顏色接近光譜色的程度。一種顏色,可以看成是某種光譜色與白色混合的結果。其中光譜色所占的比例愈大,顏色接近光譜色的程度就愈高,顏色的飽和度也就愈高。飽和度高,顏色則深而艷。光譜色的白光成分為0,飽和度達到最高。通常取值范圍為0%~100%,值越大,顏色越飽和。
明度V:明度表示顏色明亮的程度,對于光源色,明度值與發光體的光亮度有關;對于物體色,此值和物體的透射比或反射比有關。通常取值范圍為0%(黑)到100%(白)。
RGB和CMY顏色模型都是面向硬件的,而HSV(Hue Saturation Value)顏色模型是面向用戶的。
HSV模型的三維表示從RGB立方體演化而來。設想從RGB沿立方體對角線的白色頂點向黑色頂點觀察,就可以看到立方體的六邊形外形。六邊形邊界表示色彩,水平軸表示純度,明度沿垂直軸測量。
且已有前人通過實驗計算出大致顏色的各分量范圍,便在此基礎上調試
4.3.2 RGB色彩空間轉HSV色彩空間
原理:
通過調用cv2庫中的cvtColor方法將RGB的原圖轉化成HSV圖
代碼段:
hsv_roi = cv.cvtColor(roi, cv.COLOR_BGR2HSV)處理結果:
RGB下的ROI?
HSV下的ROI4.3.3 顏色分離
原理:
通過對HSV色彩空間的理解和HSV色彩表下,調試出四個顏色區間用于分離綠色、藍色、橙色、褐色
綠色:H分量:35-77 ???S分量:43-255 ??V分量:46-255
藍色:H分量:100-124 ?S分量:43-255?? V分量:46-255
橙色:H分量:11-25 ???S分量:100-255 ?V分量:150-255
褐色:H分量:0-10 ????S分量:43-255 ??V分量:46-255
處理結果:
RGB下的ROI 綠色區間下的ROI 藍色區間下的ROI 橙色區間下的ROI?
棕色區間內下的ROI4.3.4 顏色點統計
原理:
由于橙色和褐色在HSV色域中不能完全分離,且四條白線摻雜著其他四種顏色,不能完全分離出八條顏色,固采用對線條輪廓內的像素點符合相應顏色區間內像素點的個數,個數多的線的輪廓為純色,否則為相應的白線,并且先識別出橙色的兩條線之后,再識別褐色的兩條線,從而實現橙色和褐色的分離。最后將八條線的順序:白橙、橙、白綠、藍、白藍、綠、白褐、褐的結果顯示在原圖上如下圖所示
控制臺打印出的顏色點統計列表首先識別綠色,得出兩個最大值的線的輪廓之后,數值最大的輪廓為純色,否則為相應的白色,如green列表中,最大值為148,此線條輪廓為綠色,次大值為71,此線條輪廓為白綠色,下次遍歷時便剔除這兩條線的輪廓,以此循環直至識別完八條線。
def calColPbl(self, roi, box, color):x,y,w,h = boxcount = 0if color == 'green':for i in range(w):for j in range(h):if (self.low_green[0] < roi[y+j,x+i,0] < self.high_green[0]) and \(self.low_green[1] < roi[y+j,x+i,1] < self.high_green[1]) and \(self.low_green[2] < roi[y+j,x+i,2] < self.high_green[2]):count = count + 1if color == 'blue':for i in range(w):for j in range(h):if (self.low_blue[0] < roi[y+j,x+i,0] < self.high_blue[0]) and \(self.low_blue[1] < roi[y+j,x+i,1] < self.high_blue[1]) and \(self.low_blue[2] < roi[y+j,x+i,2] < self.high_blue[2]):count = count + 1if color == 'orange':for i in range(w):for j in range(h):if (self.low_orange[0] < roi[y+j,x+i,0] < self.high_orange[0]) and \(self.low_orange[1] < roi[y+j,x+i,1] < self.high_orange[1]) and \(self.low_orange[2] < roi[y+j,x+i,2] < self.high_orange[2]):count = count + 1if color == 'brown':for i in range(w):for j in range(h):if (self.low_brown[0] < roi[y+j,x+i,0] < self.high_brown[0]) and \(self.low_brown[1] < roi[y+j,x+i,1] < self.high_brown[1]) and \(self.low_brown[2] < roi[y+j,x+i,2] < self.high_brown[2]):count = count + 1return count def colorDetection(self, raw_img, roi, boxes):if len(boxes) != 8:return Falsehsv_roi = cv.cvtColor(roi, cv.COLOR_BGR2HSV)# # hsv_roi = cv.GaussianBlur(hsv_roi, (5,5), 0)cv.imshow('hsv',hsv_roi)for color in self.color_detect:cal_result = []cal_result = [self.calColPbl(hsv_roi, box, color) for box in boxes]max_index = cal_result.index(max(cal_result))cal_result[max_index] = 0smax_index = cal_result.index(max(cal_result))if max_index == smax_index:return Falsemax_box = boxes[max_index]smax_box = boxes[smax_index]boxes.remove(max_box)boxes.remove(smax_box)max_str = eval('self.'+str(color))smax_str = eval('self.'+str(color)+'_w')image = cv.putText(raw_img, max_str, (182+max_box[0],155+max_box[1]), cv.FONT_HERSHEY_SIMPLEX, 0.5, (0,255,0), 1)image = cv.putText(raw_img, smax_str, (182+smax_box[0],155+smax_box[1]), cv.FONT_HERSHEY_SIMPLEX, 0.5, (0,255,0), 1)return True處理結果:
最終識別結果?
總結
以上是生活随笔為你收集整理的基于opencv python 的网线线序识别(三)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机生成的精美图形,太震撼啦!!!
- 下一篇: Python tkinter 设置主题