Opencv識別圖片顏色并繪制輪廓實現(xiàn)代碼示例
一、實驗原理
1、顏色空間轉(zhuǎn)換:
Opencv識別圖片顏色的邏輯
OpenCV 的默認顏色空間為 BGR(藍、綠、紅),但識別特定顏色更適合在 HSV(色調(diào)、飽和度、亮度)顏色空間中進行。
HSV 優(yōu)勢:能夠更方便地描述顏色范圍,用于篩選特定顏色區(qū)域。
2、顏色范圍過濾:
不同顏色的HSV值
利用 cv2.inRange 函數(shù),通過設定的顏色范圍,將指定顏色區(qū)域提取為二值掩膜。
3、圖像處理:
①濾波:
通過中值濾波去除噪點,平滑圖像。濾波是應用卷積來實現(xiàn)的,卷積的關鍵就是卷積核,下圖為卷積核濾波原理:
②形態(tài)學變換:
通過開運算(先腐蝕后膨脹)進一步消除小噪聲和孤立點。
4、輪廓提取和繪制:
- 利用 cv2.findContours 提取二值圖像的輪廓。
- 根據(jù)輪廓面積進行過濾,保留符合條件的目標區(qū)域。
- 使用 cv2.drawContours 在原圖上繪制輪廓。
cv2.drawContours(image, contours, contourIdx, color, thickness, lineType, hierarchy, maxLevel, offset)
二、實驗代碼
import cv2 import numpy as np # 1. 輸入圖片并調(diào)整大小 img = cv2.imread("./color_1.png") if img is None: print("無法加載圖片,請檢查路徑!") exit() img = cv2.resize(img, (0, 0), fx=0.7, fy=0.7) # 2. 轉(zhuǎn)換 HSV 顏色空間 img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 3. 定義顏色范圍并生成二值掩膜 yellow_min = np.array([26, 43, 46]) # 黃色下界 yellow_max = np.array([34, 255, 255]) # 黃色上界 img_mask = cv2.inRange(img_hsv, yellow_min, yellow_max) # 4. 中值濾波去噪 img_blur = cv2.medianBlur(img_mask, 7) # 5. 形態(tài)學變換 - 開運算 kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5)) img_open = cv2.morphologyEx(img_blur, cv2.MORPH_OPEN, kernel) # 6. 輪廓提取 contours, _ = cv2.findContours(img_open, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 7. 遍歷輪廓并繪制 img_result = img.copy() for contour in contours: area = cv2.contourArea(contour) if area < 200 or area > 200000: # 根據(jù)面積過濾無效輪廓 continue cv2.drawContours(img_result, [contour], -1, (0, 0, 255), 2) # 繪制輪廓 # 8. 顯示結(jié)果 cv2.imshow("Original Image", img) cv2.imshow("Filtered Contours", img_result) cv2.waitKey(0) cv2.destroyAllWindows()
三、實驗現(xiàn)象
1、原始圖像:
顯示未處理的原始圖片,包含多個顏色區(qū)域。
2、顏色掩膜:
二值圖像僅顯示識別出的黃色區(qū)域,其余部分為黑色背景。
3、濾波和平滑:
- 濾波后噪點減少,目標區(qū)域更加連續(xù)。
- 開運算消除了孤立的噪聲點,保留了主要的目標區(qū)域。
4、輪廓繪制:
- 符合面積條件的輪廓被成功繪制,輪廓線為紅色。
- 無效的小輪廓被過濾,不影響結(jié)果的清晰度。
總結(jié)
到此這篇關于Opencv識別圖片顏色并繪制輪廓實現(xiàn)的文章就介紹到這了,更多相關Opencv識別圖片顏色繪制輪廓內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python?Pandas中l(wèi)oc和iloc函數(shù)的基本用法示例
無論是loc還是iloc都是pandas中數(shù)據(jù)篩選的函數(shù),下面這篇文章主要給大家介紹了關于Python?Pandas中l(wèi)oc和iloc函數(shù)的基本用法示例,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下2022-07-07python實現(xiàn)系統(tǒng)狀態(tài)監(jiān)測和故障轉(zhuǎn)移實例方法
這篇文章主要介紹了用python實現(xiàn)系統(tǒng)狀態(tài)監(jiān)測和故障轉(zhuǎn)移的代碼方法2013-11-11Django+Nginx+uWSGI 定時任務的實現(xiàn)方法
本文主要介紹了Django+Nginx+uWSGI 定時任務的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01Python中的np.vstack()和np.hstack()詳解
這篇文章主要介紹了np.vstack()和np.hstack(),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-04-04Python入門教程(四十)Python的NumPy數(shù)組創(chuàng)建
這篇文章主要介紹了Python入門教程(四十)Python的NumPy數(shù)組創(chuàng)建,NumPy 用于處理數(shù)組,NumPy 中的數(shù)組對象稱為 ndarray,我們可以使用 array() 函數(shù)創(chuàng)建一個 NumPy ndarray 對象,需要的朋友可以參考下2023-05-05