4.7 KiB
使用 Python 进行颜色检测——初学者参考
原文:https://www.askpython.com/python/examples/color-detection
你好,程序员朋友们!今天在本教程中,我们将学习如何在 Python 中的 OpenCV 库的帮助下检测图像中的各种颜色。
颜色检测简介
检测图像中任何颜色名称的过程称为颜色检测。对人类来说,这是一项极其简单的任务,但对计算机来说却不那么简单。人类的眼睛和大脑协同工作,将光转化为颜色。信号通过我们眼睛里的光感受器传递到大脑。这种颜色被我们的大脑识别出来。
在这个 Python 颜色检测教程中,我们将创建一个应用程序,让您只需点击它就可以获得颜色的名称。因此,我们需要一个包含颜色名称和值的数据文件。然后我们将计算每种颜色之间的距离,并选择距离最小的颜色。
用于颜色检测的数据集
红、绿、蓝是构成任何可用颜色的三原色。计算机中的每个颜色值都被定义为 0 到 255 之间的一个数字。一种颜色可以有大约 1650 万种不同的表现方式。我们需要使用数据集将每种颜色的值转换成它们的名称。我们将使用包含 RGB 值及其名称的数据集。
导入 OpenCV
第一步是导入所有需要的模块和 OpenCV,然后加载图像,但是要确保图像和代码文件在同一个文件夹中。
import cv2
import numpy as np
import pandas as pd
img = cv2.imread("sample.jpg")
加载“colors.csv”文件
我们利用pandas库对 CSV 这样的数据文件进行操作。而pd.read_csv()函数用于加载和读取 CSV 文件。我们还在索引列表中为每一列指定了一个名称,以便于访问。
index = ["color", "color_name", "hex", "R", "G", "B"]
data = pd.read_csv("colors.csv", names=index, header=None)
创建一个窗口和一个回调函数
首先,我们必须创建一个显示输入图像的新窗口。然后,我们提供了一个回调函数,只有当鼠标事件在图像上发生时,该函数才会被激活。
cv2.namedWindow("Color Detection Window")
cv2.setMouseCallback("Color Detection Window",call_back_function)
但是现在我们要创建一个call_back_function这个名字提到的回调函数。
创建回调函数
让我们来理解这个回调函数将做什么:它将计算我们双击的像素的 rgb 值,并保存鼠标位置的(x,y)坐标。
def call_back_function (event, x,y,flags,param):
if event == cv2.EVENT_LBUTTONDBLCLK:
global b,g,r,xpos,ypos, clicked
clicked = True
xpos = x
ypos = y
b,g,r = img[y,x]
b = int(b)
g = int(g)
r = int(r)
从 rgb 值中提取颜色名称
既然我们已经从图像中提取了 rgb 值,现在我们需要将 rgb 值更改为颜色名称。下面的函数也是如此。
def get_Color_Name(R,G,B):
minimum = 10000
for i in range(len(csv)):
d = abs(R- int(csv.loc[i,"R"])) + abs(G- int(csv.loc[i,"G"]))+ abs(B- int(csv.loc[i,"B"]))
if(d<=minimum):
minimum = d
cname = csv.loc[i,"color_name"]
return cname
为了得到颜色名称,我们计算一个距离(d ),它告诉我们离一个特定的颜色有多近,然后选择一个距离最小的颜色。使用以下公式计算距离:
d = abs(红-红颜色)+(绿-绿颜色)+(蓝-绿颜色)
在窗口上显示结果
我们利用cv2.imshow()函数在我们之前创建的窗口上绘制图像。当用户双击窗口时,在图像上绘制一个矩形,分别使用cv2.rectangle和cv2.putText()函数获得窗口的颜色名称。
while(1):
cv2.imshow("Color Detection Window",img)
if (clicked):
cv2.rectangle(img,(20,20), (750,60), (b,g,r), -1)
text = getColorName(r,g,b)+'R='+str(r)+'G='+ str(g)+'B='+ str(b)
cv2.putText(img, text,(50,50),2,0.8, (255,255,255),2,cv2.LINE_AA)
if(r+g+b>=600):
cv2.putText(img, text,(50,50),2,0.8,(0,0,0),2,cv2.LINE_AA)
clicked=False
if cv2.waitKey(20) & 0xFF ==27:
break
cv2.destroyAllWindows()
样本输出
Color Detection Window Opencv
Detected Red Color Detection
Detected Cyan Color Detection
在另一个图像上输出
Skin Color Detection Image2
结论
今天我们学习了如何使用 Python 编程语言中的 OpenCV 来检测颜色。希望你学到了一些东西!
感谢您的阅读!



