日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

使用Python,OpenCV确定对象的颜色

發(fā)布時間:2023/11/27 生活经验 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用Python,OpenCV确定对象的颜色 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1. 如何利用Python、OpenCV計算輪廓的中心
2. Python,OpenCV應(yīng)用輪廓逼近算法,檢測對象的形狀,如三角形,正方形,矩形,五邊形,圓。

這一節(jié)學(xué)習(xí)應(yīng)用 L * a * b * 顏色空間確定對象的顏色,與其顏色的通道計算最小的歐幾里得距離,得到其顏色最接近預(yù)定義的顏色。

這個方法有其缺陷,會把顏色飽和度不夠的(非紅、綠、藍)的顏色也標(biāo)記為紅或綠或藍。(取決于預(yù)定義的顏色空間的準(zhǔn)確度)。

檢測顏色過程:

  1. 預(yù)定義顏色空間(顏色:BRG的值)
  2. 循環(huán)遍歷顏色并將其轉(zhuǎn)換為 L * a * b 空間的值
  3. 尋找輪廓,為輪廓構(gòu)建一個蒙版,計算蒙版區(qū)域的平均 L * a * b 值
  4. 遍歷已轉(zhuǎn)換后的 L * a * b 空間list,分別與蒙版計算歐幾里得距離,得到最小的距離值,以及其對應(yīng)的顏色。則認(rèn)為該顏色就是最接近的顏色——輪廓的顏色
# 用來標(biāo)記帶有顏色文本標(biāo)簽的圖像區(qū)域
# 創(chuàng)建一個Python類,該類可用于用關(guān)聯(lián)的顏色標(biāo)記圖像中的形狀。# 導(dǎo)入必要的包
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*圖像分配內(nèi)存 并且初始化顏色名稱listself.lab = np.zeros((len(colors), 1, 3), dtype="uint8")self.colorNames = []# 循環(huán)遍歷顏色字典for (i, (name, rgb)) in enumerate(colors.items()):# 更新L*a*b數(shù)組 及 顏色listself.lab[i] = rgbself.colorNames.append(name)# 轉(zhuǎn)換 RGB顏色空間 為 L*a*b* 數(shù)組self.lab = cv2.cvtColor(self.lab, cv2.COLOR_RGB2LAB)# image:待檢測的圖像, c:輪廓def label(self, image, c):# 為輪廓構(gòu)建一個蒙版,計算蒙版區(qū)域的 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 數(shù)組顏色for (i, row) in enumerate(self.lab):# 計算每個已知顏色與平均顏色之間的歐幾里得距離d = dist.euclidean(row[0], mean)# 如果距離比當(dāng)前距離小,更新保留的距離變量值if d < minDist[0]:minDist = (d, i)# 返回最小歐幾里得距離值的顏色return self.colorNames[minDist[1]]

1. 實現(xiàn)

  1. 加載圖像、縮放、高斯平滑高頻噪音、灰度圖、BGR空間轉(zhuǎn) L * a * b空間, 閾值化(背景黑色,前景輪廓白色)、尋找輪廓
  2. 遍歷輪廓,尋找輪廓中心,檢測顏色
  3. 從中心位置,繪制顏色標(biāo)簽文本

2. 優(yōu)化

顏色是可以識別,但是有些瑕疵,顏色不飽滿的檢測有誤,橘色的被檢測成紅色,黃色的檢測呈綠色;優(yōu)化辦法用 rangeDetector或者cv2.inRange()

(1)預(yù)先定義要檢測的顏色的上下限范圍(可以是Lab,HSV等顏色空間);
(2)運用cv2.inRange得到匹配顏色上下限范圍的蒙版圖;
(3)運用cv2.bitwise_and獲得按位與結(jié)果圖;

# python detect_color.py --image pokens.png# 導(dǎo)入必要的包
import numpy as np
import argparse
import cv2# 構(gòu)建命令行參數(shù)
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])
]# 現(xiàn)在我們有了邊界列表,我們可以使用cv2.inRange 功能執(zhí)行實際的顏色檢測。
# 遍歷邊界列表
for (lower, upper) in boundaries:# 從邊界列表構(gòu)建 Numpy數(shù)組 由于這些像素值在[0,256]范圍內(nèi),因此我們可以使用無符號8位整數(shù)數(shù)據(jù)類型。lower = np.array(lower, dtype="uint8")upper = np.array(upper, dtype="uint8")# 找到固定邊界中范圍所匹配的顏色,并應(yīng)用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/

總結(jié)

以上是生活随笔為你收集整理的使用Python,OpenCV确定对象的颜色的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。