【机器学习实战入门】使用 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 命令:

pip install opencv-python numpy pandas
构建 Python 颜色检测项目的步骤

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

  1. 下载并解压 zip 文件
    颜色检测 ZIP 文件

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

  • Color_detection.py – 项目的主要源代码。
  • Colorpic.jpg – 用于实验的样本图片。
  • Colors.csv – 包含我们数据集的文件。
  1. 从用户那里获取图像
    我们使用 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)
  1. 用 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)
  1. 在窗口上设置鼠标回调事件
    首先,我们创建一个窗口以显示输入的图像。然后,当鼠标事件发生时,我们设置一个回调函数,该函数将被调用。
cv2.namedWindow('image')
cv2.setMouseCallback('image', draw_function)

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

  1. 创建 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)
  1. 计算距离以获取颜色名称
    我们有 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
  1. 在窗口上显示图像
    每当双击事件发生时,它将更新窗口上的颜色名称和 RGB 值。

使用 cv2.imshow() 函数,我们在窗口上绘制图像。当用户双击窗口时,我们使用 cv2.rectanglecv2.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()
  1. 运行 Python 文件
    现在这个简单的 Python 项目已经完成,你可以从命令提示符中运行 Python 文件。确保使用 ‘-i’ 参数提供图像路径。如果图像位于另一个目录中,则需要提供图像的完整路径:
python color_detection.py -i <在这里添加你的图像路径>
输出

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

  • 双击窗口以知道像素的颜色名称
  • import cv2 - Python 小项目
  • def getColorName - Python 项目
  • while (1) - Python 数据科学项目
总结

在这个带有源代码的 Python 项目中,我们学习了颜色以及如何提取像素的 RGB 值和颜色名称。我们学习了如何处理双击窗口等事件,并看到了如何使用 pandas 读取 CSV 文件并执行数据操作。这在许多图像编辑和绘图应用中都有所使用。

参考文献

名称链接
DataFlair Python Projectshttps://data-flair.training/blogs/python-projects/
Python Color Detection Projecthttps://data-flair.training/blogs/python-color-detection-project/
OpenCV Documentationhttps://docs.opencv.org/4.5.1/
Pandas Documentationhttps://pandas.pydata.org/pandas-docs/stable/
Python for Image Processinghttps://realpython.com/python-opencv-color-spaces/
What is Color Detection?https://www.geeksforgeeks.org/color-detection-python-opencv/
How to use argparse in Pythonhttps://docs.python.org/3/howto/argparse.html
A Simple Guide to Pandashttps://towardsdatascience.com/a-simple-guide-to-pandas-2ae0753f5218
Python Colors Datasethttps://github.com/codeifitech/colordetect/blob/master/colors.csv
Color Space Conversionhttps://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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/67475.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

matlab中的griddata函数

在Matlab中&#xff0c;griddata函数用于对二维或三维散点数据进行插值。griddata函数支持多种插值方法&#xff0c;其中包括natural方法。以下是关于griddata函数与natural插值方法的关系的详细说明&#xff1a; griddata函数概述 griddata函数主要用于将不规则分布的数据点…

vue2 web 多标签输入框 elinput是否当前焦点

又来分享一点点工作积累及解决方案 产品中需要用户输入一些文字后按下回车键生成标签来显示在页面上&#xff0c;经过尝试与改造完成如下&#xff1a; <template><div class"tags-view" click"beginInput"><el-tag :key"index" …

MySQL 数据库 :SQL 语句规约(不得使用外键与级联,一切外键概念必须在应用层解决。)

文章目录 I 强制规约表名限定数据订正禁止使用存储过程,存储过程难以调试和扩展,更没有移植性。不得使用外键与级联,一切外键概念必须在应用层解决。使用 ISNULL() 来判断是否为 NULL 值NPE 问题不要使用 count(列名) 或 count(常量) 来替代 count(*)II 建议in 操作能避免则…

大文件上传的解决办法~文件切片、秒传、限制文件并发请求。。。

1、项目背景&#xff1a;针对大文件上传&#xff0c;如果将文件作为一个请求去发送给后端&#xff0c;会有以下几种问题&#xff0c;首先是上传时间长&#xff0c;用户不能进行其他操作&#xff0c;包括页面刷新等操作&#xff0c;其次有的接口会设置响应时间限制&#xff0c;可…

如何开放2375和2376端口供Docker daemon监听

Linux (以 Ubuntu 为例) 1. 修改 Docker 配置文件 打开 Docker 的配置文件 /etc/docker/daemon.json。如果该文件不存在&#xff0c;则可以创建一个新的。 bash sudo nano /etc/docker/daemon.json在配置文件中添加以下内容&#xff1a; json {"hosts": ["un…

SSE 实践:用 Vue 和 Spring Boot 实现实时数据传输

前言 大家好&#xff0c;我是雪荷。最近我在灵犀 BI 项目中引入了 SSE 技术&#xff0c;以保证图表的实时渲染&#xff0c;当图表渲染完毕服务端推送消息至浏览器端触发重新渲染。 什么是 SSE&#xff1f; SSE 全称为 Server-Send Events 意思是服务端推送事件。 SSE 相比于 …

记录一次 centos 启动失败

文章目录 现场1分析1现场2分析2搜索实际解决过程 现场1 一次断电,导致 之前能正常启动的centos 7.7 起不来了有部分log , 关键信息如下 [1.332724] XFS(sda3): Internal error xfs ... at line xxx of fs/xfs/xfs_trans.c [1.332724] XFS(sda3): Corruption of in-memory data…

【狂热算法篇】探秘图论之 Floyd 算法:解锁最短路径的神秘密码(通俗易懂版)

&#xff1a; 羑悻的小杀马特.-CSDN博客羑悻的小杀马特.擅长C/C题海汇总,AI学习,c的不归之路,等方面的知识,羑悻的小杀马特.关注算法,c,c语言,青少年编程领域.https://blog.csdn.net/2401_82648291?spm1010.2135.3001.5343 在本篇文章中&#xff0c;博主将带大家去学习所谓的…

使用arthas监控诊断java应用

使用arthas监控诊断java应用 简介 arthas是阿里的一款线上监控诊断产品&#xff0c;通过全局视角实时查看应用 load、内存、gc、线程的状态信息&#xff0c;并能在不修改应用代码的情况下&#xff0c;对业务问题进行诊断&#xff0c;包括查看方法调用的出入参、异常&#xff…

【k8s面试题2025】3、练气中期

体内灵气的量和纯度在逐渐增加。 文章目录 在 Kubernetes 中自定义 Service端口报错常用控制器Kubernetes 中拉伸收缩副本失效设置节点容忍异常时间Deployment 控制器的升级和回滚日志收集资源监控监控 Docker将 Master 节点设置为可调度 在 Kubernetes 中自定义 Service端口报…

Linux安装docker,安装配置xrdp远程桌面

Linux安装docker&#xff0c;安装配置xrdp远程桌面。 1、卸载旧版本docker 卸载旧版本docker命令 yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine现在就是没有旧版本的d…

Ubuntu20.04取消root账号自动登录的方法,触觉智能RK3568开发板演示

Ubuntu20.04默认情况下为root账号自动登录&#xff0c;本文介绍如何取消root账号自动登录&#xff0c;改为通过输入账号密码登录&#xff0c;使用触觉智能EVB3568鸿蒙开发板演示&#xff0c;搭载瑞芯微RK3568&#xff0c;四核A55处理器&#xff0c;主频2.0Ghz&#xff0c;1T算力…

LeetCode | 解锁数组与字符串的秘密:经典题型详解与高效解法

1.理论 1. 1.核心概念 1.1.1.数组(Array) 定义&#xff1a;存储相同数据类型的元素的线性集合。 特点&#xff1a;支持随机访问&#xff08;通过索引&#xff09;;元素存储在连续内存中&#xff0c;支持高效的读写操作。 时间复杂度&#xff1a;访问&#xff1a;O(1);插入…

怎么修复损坏的U盘?而且不用格式化的方式!

当你插入U盘时&#xff0c;若电脑弹出“需要格式化才能使用”提示&#xff0c;且无法打开或读取其中的数据&#xff0c;说明U盘极有可能已经损坏。除此之外&#xff0c;若电脑在连接U盘后显示以下信息&#xff0c;也可能意味着U盘出现问题&#xff0c;需要修复损坏的U盘&#x…

数据结构漫游记:动态实现栈(stack)

嘿&#xff0c;各位技术潮人&#xff01;好久不见甚是想念。生活就像一场奇妙冒险&#xff0c;而编程就是那把超酷的万能钥匙。此刻&#xff0c;阳光洒在键盘上&#xff0c;灵感在指尖跳跃&#xff0c;让我们抛开一切束缚&#xff0c;给平淡日子加点料&#xff0c;注入满满的pa…

【spring boot统一功能处理】拦截器

拦截器 在Spring Boot中&#xff0c;拦截器&#xff08;Interceptor&#xff09;是用于在处理请求前后进行一些自定义操作的组件&#xff0c;常用于日志记录、权限检查、性能监控等。拦截器的使用依赖于HandlerInterceptor接口和WebMvcConfigurer接口。 1. HandlerIntercepto…

qt自定义加载字体库ttf

在开发过程中&#xff0c;我们会用到其他的开源字体库&#xff0c;然而在打包后会在不同的电脑上遇到没有安装该字体的问题&#xff0c;以下是通过代码在main.cpp中添加字体示例&#xff0c;以供参考&#xff1a; int main(int argc, char *argv[]) {QApplication app(argc, a…

骑砍2霸主MOD开发(11)-可编程渲染管线Shader编程

一.固定渲染管线&可编程渲染管线 固定渲染管线:GPU常规渲染算法,将3D模型经过四大变换计算得到2D屏幕图像 可编程渲染管线:定制化GPU渲染算法,需要提交Shader至GPU中,GPU根据定制化算法得到2D屏幕图像 二.CoreShader&TerrainShader CoreShader:游戏中使用的静态shader…

w163美食推荐商城

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;原创团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文…

计算机网络 (47)应用进程跨越网络的通信

前言 计算机网络应用进程跨越网络的通信是一个复杂而关键的过程&#xff0c;它涉及多个层面和组件的协同工作。 一、通信概述 计算机网络中的通信&#xff0c;本质上是不同主机中的应用进程之间的数据交换。为了实现这种通信&#xff0c;需要借助网络协议栈中的各层协议&#x…