使用Python,OpenCV确定对象的颜色
生活随笔
收集整理的這篇文章主要介紹了
使用Python,OpenCV确定对象的颜色
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1. 如何利用Python、OpenCV計算輪廓的中心
2. Python,OpenCV應用輪廓逼近算法,檢測對象的形狀,如三角形,正方形,矩形,五邊形,圓。
這一節學習應用 L * a * b * 顏色空間確定對象的顏色,與其顏色的通道計算最小的歐幾里得距離,得到其顏色最接近預定義的顏色。
這個方法有其缺陷,會把顏色飽和度不夠的(非紅、綠、藍)的顏色也標記為紅或綠或藍。(取決于預定義的顏色空間的準確度)。
檢測顏色過程:
- 預定義顏色空間(顏色:BRG的值)
- 循環遍歷顏色并將其轉換為 L * a * b 空間的值
- 尋找輪廓,為輪廓構建一個蒙版,計算蒙版區域的平均 L * a * b 值
- 遍歷已轉換后的 L * a * b 空間list,分別與蒙版計算歐幾里得距離,得到最小的距離值,以及其對應的顏色。則認為該顏色就是最接近的顏色——輪廓的顏色
# 用來標記帶有顏色文本標簽的圖像區域
# 創建一個Python類,該類可用于用關聯的顏色標記圖像中的形狀。# 導入必要的包
from scipy.spatial import distance as dist
from collections import OrderedDict
import numpy as np
import cv2class ColorLabeler:def __init__(self):# 初始化顏色字典 包括顏色名稱和RGB元組值colors = OrderedDict({"red": (255, 0, 0),"green": (0, 255, 0),"blue": (0, 0, 255)})# 為L*a*b*圖像分配內存 并且初始化顏色名稱listself.lab = np.zeros((len(colors), 1, 3), dtype="uint8")self.colorNames = []# 循環遍歷顏色字典for (i, (name, rgb)) in enumerate(colors.items()):# 更新L*a*b數組 及 顏色listself.lab[i] = rgbself.colorNames.append(name)# 轉換 RGB顏色空間 為 L*a*b* 數組self.lab = cv2.cvtColor(self.lab, cv2.COLOR_RGB2LAB)# image:待檢測的圖像, c:輪廓def label(self, image, c):# 為輪廓構建一個蒙版,計算蒙版區域的 L*a*b的平均值mask = np.zeros(image.shape[:2], dtype="uint8")cv2.drawContours(mask, [c], -1, 255, -1)mask = cv2.erode(mask, None, iterations=2)mean = cv2.mean(image, mask=mask)[:3]# 初始化到目前為止找到的最小距離minDist = (np.inf, None)# 遍歷L*a*b 數組顏色for (i, row) in enumerate(self.lab):# 計算每個已知顏色與平均顏色之間的歐幾里得距離d = dist.euclidean(row[0], mean)# 如果距離比當前距離小,更新保留的距離變量值if d < minDist[0]:minDist = (d, i)# 返回最小歐幾里得距離值的顏色return self.colorNames[minDist[1]]
1. 實現
- 加載圖像、縮放、高斯平滑高頻噪音、灰度圖、BGR空間轉 L * a * b空間, 閾值化(背景黑色,前景輪廓白色)、尋找輪廓
- 遍歷輪廓,尋找輪廓中心,檢測顏色
- 從中心位置,繪制顏色標簽文本
2. 優化
顏色是可以識別,但是有些瑕疵,顏色不飽滿的檢測有誤,橘色的被檢測成紅色,黃色的檢測呈綠色;優化辦法用 rangeDetector或者cv2.inRange()
(1)預先定義要檢測的顏色的上下限范圍(可以是Lab,HSV等顏色空間);
(2)運用cv2.inRange得到匹配顏色上下限范圍的蒙版圖;
(3)運用cv2.bitwise_and獲得按位與結果圖;
# python detect_color.py --image pokens.png# 導入必要的包
import numpy as np
import argparse
import cv2# 構建命令行參數
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", help="path to the image")
args = vars(ap.parse_args())
# 加載圖片
image = cv2.imread(args["image"])# 定義顏色邊界list 分別為紅、藍、黃、灰
# numpy以 BGR顏色空間以下限:[17, 15, 100],上限: [50, 56, 200]表示 紅色
boundaries = [([17, 15, 100], [50, 56, 200]),([86, 31, 4], [220, 88, 50]),([25, 146, 190], [62, 174, 250]),([103, 86, 65], [145, 133, 128])
]# 現在我們有了邊界列表,我們可以使用cv2.inRange 功能執行實際的顏色檢測。
# 遍歷邊界列表
for (lower, upper) in boundaries:# 從邊界列表構建 Numpy數組 由于這些像素值在[0,256]范圍內,因此我們可以使用無符號8位整數數據類型。lower = np.array(lower, dtype="uint8")upper = np.array(upper, dtype="uint8")# 找到固定邊界中范圍所匹配的顏色,并應用maskmask = cv2.inRange(image, lower, upper)output = cv2.bitwise_and(image, image, mask=mask)# 展示圖像cv2.imshow("images", np.hstack([image, output]))cv2.waitKey(0)
參考:
https://www.pyimagesearch.com/2014/08/04/opencv-python-color-detection/
https://www.pyimagesearch.com/2016/02/15/determining-object-color-with-opencv/
總結
以上是生活随笔為你收集整理的使用Python,OpenCV确定对象的颜色的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python全局解释器锁GIL与多线程
- 下一篇: centos7.4.3 部署python