Python 颜色检测项目
今天的项目将非常有趣和令人兴奋。我们将与颜色打交道,并在项目过程中学习许多概念。颜色检测对于识别物体来说是必要的,它也被用作各种图像编辑和绘图应用的工具。
什么是颜色检测?
颜色检测是检测任何颜色名称的过程。这看起来很简单,对吧?对于人类来说,这是一个极其简单的任务,但对于计算机来说,却不是那么直接。人眼和大脑协同工作将光转化为颜色。我们眼睛中的光感受器将信号传输给大脑,大脑再识别颜色。从小开始,我们就将某些光线与它们的颜色名称联系起来。我们将使用类似的方法来检测颜色名称。
关于 Python 颜色检测项目
在这个颜色检测 Python 项目中,我们将会构建一个应用程序,通过点击颜色,你可以自动获得颜色的名称。为此,我们将有一个包含颜色名称及其值的数据文件。然后,我们将计算与每种颜色的距离,并找到最短的距离。
数据集
颜色由3种主要颜色组成:红、绿、蓝。在计算机中,我们定义每种颜色的值在0到255的范围内。那么,我们有多少种方式可以定义颜色呢?答案是 256256256 = 16,581,375。大约有1650万种不同的方式来表示颜色。在我们的数据集中,我们需要将每种颜色的值与它们相应的名称对应起来。但不用担心,我们不需要映射所有的值。我们将使用一个包含 RGB 值及其相应名称的数据集。CSV 文件来自以下链接:
- 颜色数据集
colors.csv
文件包含 865 个颜色名称以及它们的 RGB 和十六进制值。
必备知识
在开始这个带有源代码的 Python 项目之前,你应该熟悉 Python 的计算机视觉库 OpenCV 和 Pandas。
OpenCV、Pandas 和 numpy 是这个 Python 项目中必需的 Python 包。要安装它们,只需在终端中运行这个 pip 命令:
pip install opencv-python numpy pandas
构建 Python 颜色检测项目的步骤
以下是构建可以检测颜色的 Python 应用程序的步骤:
- 下载并解压 zip 文件
颜色检测 ZIP 文件
项目文件夹包含3个文件:
Color_detection.py
– 项目的主要源代码。Colorpic.jpg
– 用于实验的样本图片。Colors.csv
– 包含我们数据集的文件。
- 从用户那里获取图像
我们使用 argparse 库创建一个参数解析器。我们可以直接从命令提示符中提供图像路径:
import argparse
ap = argparse.ArgumentParser()
ap.add_argument('-i', '--image', required=True, help="Image Path")
args = vars(ap.parse_args())
img_path = args['image']
# 使用 OpenCV 读取图像
img = cv2.imread(img_path)
- 用 pandas 读取 CSV 文件
当需要对数据文件如 CSV 进行各种操作时,pandas 库非常有用。pd.read_csv()
读取 CSV 文件并将其加载到 pandas DataFrame 中。我们给每个列分配了一个名称,以便于访问。
# 使用 pandas 读取 CSV 文件并命名每一列
index=["color","color_name","hex","R","G","B"]
csv = pd.read_csv('colors.csv', names=index, header=None)
- 在窗口上设置鼠标回调事件
首先,我们创建一个窗口以显示输入的图像。然后,当鼠标事件发生时,我们设置一个回调函数,该函数将被调用。
cv2.namedWindow('image')
cv2.setMouseCallback('image', draw_function)
通过这些代码行,我们将窗口命名为 ‘image’,并在鼠标事件发生时调用 draw_function()
。
- 创建
draw_function
它会计算我们双击的像素的 RGB 值。函数参数包括事件名称、鼠标位置的 (x,y) 坐标等。在函数中,我们检查事件是否为双击,如果是,则计算并设置 r、g、b 值以及鼠标的位置。
def draw_function(event, x, y, flags, param):if event == cv2.EVENT_LBUTTONDBLCLK:global b, g, r, xpos, ypos, clickedclicked = Truexpos = xypos = yb, g, r = img[y, x]b = int(b)g = int(g)r = int(r)
- 计算距离以获取颜色名称
我们有 r、g 和 b 的值。现在,我们需要另一个函数,该函数将从 RGB 值返回颜色名称。为了获得颜色名称,我们计算一个距离(d),该距离告诉我们我们离颜色有多近,并选择距离最短的那一个。
我们的距离由以下公式计算:
d = abs(Red – ithRedColor) + abs(Green – ithGreenColor) + abs(Blue – ithBlueColor)
def getColorName(R, G, B):minimum = 10000for 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 = dcname = csv.loc[i, "color_name"]return cname
- 在窗口上显示图像
每当双击事件发生时,它将更新窗口上的颜色名称和 RGB 值。
使用 cv2.imshow()
函数,我们在窗口上绘制图像。当用户双击窗口时,我们使用 cv2.rectangle
和 cv2.putText()
函数绘制一个矩形并获取颜色名称以在窗口上显示文本。
while(1):cv2.imshow("image", img)if (clicked):# cv2.rectangle(image, startpoint, endpoint, color, thickness) -1 厚度填满整个矩形cv2.rectangle(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, (可选的 bottomLeft bool) )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# 当用户按下 'esc' 键时中断循环if cv2.waitKey(20) & 0xFF == 27:break
cv2.destroyAllWindows()
- 运行 Python 文件
现在这个简单的 Python 项目已经完成,你可以从命令提示符中运行 Python 文件。确保使用 ‘-i’ 参数提供图像路径。如果图像位于另一个目录中,则需要提供图像的完整路径:
python color_detection.py -i <在这里添加你的图像路径>
输出
双击窗口以知道像素的颜色名称
- 双击窗口以知道像素的颜色名称
- import cv2 - Python 小项目
- def getColorName - Python 项目
- while (1) - Python 数据科学项目
总结
在这个带有源代码的 Python 项目中,我们学习了颜色以及如何提取像素的 RGB 值和颜色名称。我们学习了如何处理双击窗口等事件,并看到了如何使用 pandas 读取 CSV 文件并执行数据操作。这在许多图像编辑和绘图应用中都有所使用。
参考文献
名称 | 链接 |
---|---|
DataFlair Python Projects | https://data-flair.training/blogs/python-projects/ |
Python Color Detection Project | https://data-flair.training/blogs/python-color-detection-project/ |
OpenCV Documentation | https://docs.opencv.org/4.5.1/ |
Pandas Documentation | https://pandas.pydata.org/pandas-docs/stable/ |
Python for Image Processing | https://realpython.com/python-opencv-color-spaces/ |
What is Color Detection? | https://www.geeksforgeeks.org/color-detection-python-opencv/ |
How to use argparse in Python | https://docs.python.org/3/howto/argparse.html |
A Simple Guide to Pandas | https://towardsdatascience.com/a-simple-guide-to-pandas-2ae0753f5218 |
Python Colors Dataset | https://github.com/codeifitech/colordetect/blob/master/colors.csv |
Color Space Conversion | https://www.tutorialspoint.com/opencv/opencv_color_spaces.htm |
OpenCV 教程 | https://www.bilibili.com/video/BV18x41147d6/ |
Python 颜色检测 | https://zhuanlan.zhihu.com/p/35647438 |
了解色彩空间 | https://www.runoob.com/python3/python3-tutorial.html |
颜色检测实战 | http://blog.csdn.net/qq_33066040/article/details/78800004 |
Python 计算机视觉入门 | https://morvanzhou.github.io/tutorials/machine-learning/opencv/ |
用 OpenCV 构建颜色检测器 | https://medium.com/@billy.r---------/building-a-color-detector-with-opencv-3baf62e6fac9 |