【机器学习实战入门】使用Pandas和OpenCV进行颜色检测

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 命令:

bash 复制代码
pip install opencv-python numpy pandas
构建 Python 颜色检测项目的步骤

以下是构建可以检测颜色的 Python 应用程序的步骤:

  1. 下载并解压 zip 文件

项目文件夹包含3个文件:

  • Color_detection.py -- 项目的主要源代码。
  • Colorpic.jpg -- 用于实验的样本图片。
  • Colors.csv -- 包含我们数据集的文件。
  1. 从用户那里获取图像
    我们使用 argparse 库创建一个参数解析器。我们可以直接从命令提示符中提供图像路径:
python 复制代码
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)
  1. 用 pandas 读取 CSV 文件
    当需要对数据文件如 CSV 进行各种操作时,pandas 库非常有用。pd.read_csv() 读取 CSV 文件并将其加载到 pandas DataFrame 中。我们给每个列分配了一个名称,以便于访问。
python 复制代码
# 使用 pandas 读取 CSV 文件并命名每一列
index=["color","color_name","hex","R","G","B"]
csv = pd.read_csv('colors.csv', names=index, header=None)
  1. 在窗口上设置鼠标回调事件
    首先,我们创建一个窗口以显示输入的图像。然后,当鼠标事件发生时,我们设置一个回调函数,该函数将被调用。
python 复制代码
cv2.namedWindow('image')
cv2.setMouseCallback('image', draw_function)

通过这些代码行,我们将窗口命名为 'image',并在鼠标事件发生时调用 draw_function()

  1. 创建 draw_function
    它会计算我们双击的像素的 RGB 值。函数参数包括事件名称、鼠标位置的 (x,y) 坐标等。在函数中,我们检查事件是否为双击,如果是,则计算并设置 r、g、b 值以及鼠标的位置。
python 复制代码
def draw_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)
  1. 计算距离以获取颜色名称
    我们有 r、g 和 b 的值。现在,我们需要另一个函数,该函数将从 RGB 值返回颜色名称。为了获得颜色名称,我们计算一个距离(d),该距离告诉我们我们离颜色有多近,并选择距离最短的那一个。

我们的距离由以下公式计算:

d = abs(Red -- ithRedColor) + abs(Green -- ithGreenColor) + abs(Blue -- ithBlueColor)
python 复制代码
def getColorName(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
  1. 在窗口上显示图像
    每当双击事件发生时,它将更新窗口上的颜色名称和 RGB 值。

使用 cv2.imshow() 函数,我们在窗口上绘制图像。当用户双击窗口时,我们使用 cv2.rectanglecv2.putText() 函数绘制一个矩形并获取颜色名称以在窗口上显示文本。

python 复制代码
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()
  1. 运行 Python 文件
    现在这个简单的 Python 项目已经完成,你可以从命令提示符中运行 Python 文件。确保使用 '-i' 参数提供图像路径。如果图像位于另一个目录中,则需要提供图像的完整路径:
bash 复制代码
python color_detection.py -i <在这里添加你的图像路径>




输出

双击窗口以知道像素的颜色名称


总结

在这个带有源代码的 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
相关推荐
丶213634 分钟前
【分类】【损失函数】处理类别不平衡:CEFL 和 CEFL2 损失函数的实现与应用
人工智能·分类·损失函数
王了了哇1 小时前
精度论文:【Focaler-IoU: More Focused Intersection over Union Loss】
人工智能·pytorch·深度学习·计算机视觉·transformer
程序员陆通1 小时前
使用 Python 开发一个 AI Agent 自媒体助手示例
人工智能·python·媒体
ifanatic1 小时前
[每周一更]-(第132期):AI工具集对比
人工智能
最好Tony1 小时前
python编程-OpenCV(图像读写-图像处理-图像滤波-角点检测-边缘检测)角点检测
图像处理·python·opencv
N串2 小时前
供应链系统设计-供应链中台系统设计(八)- 商品中心设计篇
大数据
CCSBRIDGE2 小时前
对话模型的参数解释
人工智能
m0_748244962 小时前
大数据-240 离线数仓 - 广告业务 测试 ADS层数据加载 DataX数据导出到 MySQL
大数据·数据库·mysql
RacheV+TNY2642782 小时前
电商数据API接口的安全挑战与应对策略
大数据·开发语言·网络·数据库·人工智能
yuanbenshidiaos3 小时前
【大数据】机器学习-----------贝叶斯分类器
大数据·人工智能·机器学习