一、前言
该文章仅作为个人学习使用
项目源代码:Python 项目 - 使用 Pandas 和 OpenCV 进行颜色检测 - DataFlair (data-flair.training)
数据集:color-names/output/colors.csv at master · codebrainz/color-names (github.com)
二、正文
Python颜色检测项目
今天的项目将是令人兴奋和有趣的构建。我们将使用颜色,您将在整个项目中了解许多概念。颜色检测是识别物体所必需的,它也被用作各种图像编辑和绘图应用程序中的工具。
什么是颜色检测?
颜色检测是检测任何颜色名称的过程。很简单,不是吗?嗯,对于人类来说,这是一项非常容易的任务,但对于计算机来说,这并不简单。人眼和大脑协同工作,将光转化为颜色。存在于我们眼睛中的光感受器将信号传递到大脑。然后我们的大脑识别颜色。从孩提时代起,我们就用它们的颜色名称绘制了某些灯。我们将使用相同的策略来检测颜色名称。
关于 Python 项目
在这个颜色检测Python项目中,我们将构建一个应用程序,通过该应用程序,您可以通过单击颜色来自动获取颜色的名称。因此,我们将有一个包含颜色名称及其值的数据文件。然后我们将计算每个颜色的距离,并找到最短的一个。
数据集
颜色由三原色组成;红、绿色和蓝色。在计算机中,我们将每个颜色值定义在0到255的范围内。我们可以用多少种方法来定义一种颜色?答案是256*256*256 = 16581375。大约有1650万种不同的方式来表示颜色。在我们的数据集中,我们需要将每个颜色的值与它们对应的名称进行映射。但是别担心,我们不需要映射所有的值。我们将使用一个包含RGB值及其相应名称的数据集。我们数据集的CSV文件取自此链接:
csv文件包括865个颜色名称沿着以及它们的RGB和十六进制值。
先决条件
在开始这个Python项目的源代码之前,你应该熟悉Python的计算机视觉库OpenCV和Pandas。
OpenCV、Pandas和numpy是Python中这个项目所必需的Python包。要安装它们,只需在终端中运行以下pip命令:
pip install opencv-python numpy pandas
在Python中构建项目的步骤-颜色检测
以下是在Python中构建可以检测颜色的应用程序的步骤:
1.下载并解压缩zip文件
项目文件夹包含3个文件:
- Color_detection.py -我们项目的主要源代码。
- Colorpic.jpg
- csv -包含我们数据集的文件。
2.从用户获取图像
我们使用argparse库来创建一个参数解析器。我们可以直接从命令提示符给出一个图像路径:
导入argparseap = argparse。ArgumentParser()AP.add_argument('-i'字符串, '--image',required=真,帮助=“图像路径”)参数= vars(AP.parse_args())img_path = args[“形象”]#使用opencv阅读图像IMG = cv2。伊梅雷德(img_path)
3.接下来,我们用pandas读取CSV文件
当我们需要对CSV等数据文件执行各种操作时,pandas库非常有用。pd.read_csv()读取CSV文件并将其加载到pandas DataFrame中。我们为每一列指定了一个名称,以便于访问。
#用pandas阅读csv文件并给每个列命名指数=[“色”,“颜色_名称”,“十六进制”,“R”,“G”,“B”]csv = pd。read_csv('colors.csv',names=index,header=None)
4.在窗口上设置鼠标回调事件
首先,我们创建了一个窗口,输入图像将显示在其中。然后,我们设置一个回调函数,当鼠标事件发生时将调用该函数。
cv2.namedWindow(“形象”)cv2.setMouseCallback(“形象”,draw_function)
通过这些行,我们将窗口命名为“image”,并设置一个回调函数,每当鼠标事件发生时,该函数就会调用draw_function()。
5.创建draw_function
它将计算我们双击的像素的rgb值。函数参数有事件名称、鼠标位置的(x,y)坐标等。在函数中,我们检查事件是否被双击,然后计算并设置r、g、B值,沿着鼠标的x,y位置。
def 绘图功能(事件,x,y,标志,参数):如果 事件== cv2。事件_LBUTTONDBLCLK:全局B,g,r,xpos,ypos,点击点击= 真xpos = xY = YB,g,r = img[y,x]B = int(B)G = int(G)R = int(R)
6.计算距离以获得颜色名称
我们有r,g和B值。现在,我们需要另一个函数,它将从RGB值返回颜色名称。为了获得颜色名称,我们计算距离(d),它告诉我们我们与颜色的距离有多近,并选择距离最小的一个。
我们的距离是通过这个公式计算的:
d = abs(红色- ithRedColor)+(绿色- ithGreenColor)+(蓝色- ithBlueColor)
def getColorName字体(R、G、B):最小值= 10000为 我 在 范围(透镜(CSV)):D = ABS(R- int(CSV。loc[我,“R”])) + ABS(G- int(CSV。loc[我,“G”]))+ ABS(B- int(CSV。loc[我,“B”]))如果(D<=最小):最小值= dcname = csv。loc[我,“颜色_名称”]返回 CNAME
7.在窗口上显示图像
每当双击事件发生时,它将更新窗口上的颜色名称和RGB值。
使用cv2.imshow()函数,我们在窗口上绘制图像。当用户双击窗口时,我们绘制一个矩形,并使用cv2.rectangle和cv2.putText()函数获取颜色名称以在窗口上绘制文本。
而(1):cv2.imshow(“意象”,img)如果 (点击):#cv2.rectangle(image,startpoint,endpoint,color,thickness)-1厚度完全填充矩形cv2.矩形(img,(20,20), (750,60), (B,g,r), -1)#创建要显示的文本字符串(颜色名称和RGB值)text = getColorName字体(r、g、B) + ' R='+ str(R) + ' G='+ str(G) + “B=”+ str(B)#cv2.putText(img,text,start,font(0-7),fontScale,color,thickness,lineType,(optional bottomLeft bool))cv2.putText(img,文本,(50,50),2,0.8,(255,255,255),2、cv2.线_AA)#对于非常浅的颜色,我们将以黑色显示文本如果(r+g+B>=600):cv2.putText(img,文本,(50,50),2,0.8,(0,0,0),2、cv2.线_AA)点击=假#当用户按“esc”键时中断循环如果 cv2.waitKey(20) & 0xFF ==27:打破cv2.destroyAllWindows()
8.运行Python文件
初学者Python项目现在已经完成,您可以从命令提示符运行Python文件。确保使用“-i”参数给出图像路径。如果图像在另一个目录中,则需要提供图像的完整路径:
截图:
输出:
双击窗口可以知道像素颜色的名称
三、总结
在这个包含源代码的Python项目中,我们学习了颜色以及如何提取颜色RGB值和像素的颜色名称。我们学习了如何处理双击窗口等事件,并了解了如何使用pandas读取CSV文件并对数据执行操作。这在许多图像编辑和绘图应用程序中使用。