尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
基于机器学习的图像颜色识别
文章目录前言一、实验主要使用的python库二.研究流程图三.实验步骤1.安装并引入必要的库2.使用 OpenCV 读取图像2.1 使用OpenCV读取图像2.2 转换OpenCV读取色域2.3 将图像转换为灰度图3.对图像进行resize重新调整大小4.识别颜色的十六进制值5.图像读取6.获取颜色7.使用 Color 搜索图像8.定义函数匹配颜色9.匹配颜色10.选择颜色10.1 只选择绿色10.2 只选择蓝色10.3 只选择黄色颜色总结前言实验目标学习使用机器学习算法识别图像中的主要颜色。正文内容概览下文将详细介绍实验步骤并提供可供参考的代码示例。一、实验主要使用的python库名称 版本 简介Numpy 1.19.5 线性代数Sklearn 0.24.2 机器学习Matplotlib 3.3.4 数据可视化OpenCV 4.1.1.26 机器视觉二.研究流程图使用机器学习识别颜色在这个实验中我使用了机器学习算法 KMeans 来从给定图像中提取颜色。我将使用OpenCV2进行图像处理使用KMeans来识别主要颜色然后使用Matplotlib绘制图信息。三.实验步骤1.安装并引入必要的库我们先导入必要的库。我们需要导入 sklearn 用于 KMeans 算法matplotlib.pyplot 用于绘制图形numpy 用于处理数组cv2 用于处理图像数据collections 使用Counter来统计计数rgb2lab 来转换 RGB 值和 deltaE_cie76 来计算颜色之间的相似性代码示例!pip install scikit-image !pip install numpy1.19.5!pip install scikit-learn0.24.2!pip install opencv-python4.1.1.26fromsklearn.clusterimportKMeansimportmatplotlib.pyplotaspltimportnumpyasnpimportcv2fromcollectionsimportCounterfromskimage.colorimportrgb2lab,deltaE_cie76importos# 解压数据集importzipfilewithzipfile.ZipFile(./color_identify.zip)asf:f.extractall()%matplotlib inline2.使用 OpenCV 读取图像让我们首先使用OpenCV读取一个示例图像并了解我们可以对其进行的基本操作。2.1 使用OpenCV读取图像#读取图像imagecv2.imread(sample_image.jpg)print(The type of this input is {}.format(type(image)))print(Shape: {}.format(image.shape))plt.imshow(image)plt.show()2.2 转换OpenCV读取色域我们看到与原始图像相比图像具有不同的颜色。这是因为默认情况下OpenCV以颜色顺序 BLUE GREEN RED即BGR读取图像。因此我们需要将其转换为 REG GREEN BLUE即RGB。#读取图像的色域imagecv2.cvtColor(image,cv2.COLOR_BGR2RGB)plt.imshow(image)plt.show()2.3 将图像转换为灰度图如果需要图像也可以转换为灰度。#将图像转化为灰度图gray_imagecv2.cvtColor(image,cv2.COLOR_BGR2GRAY)plt.imshow(gray_image,cmapgray)plt.show()3.对图像进行resize重新调整大小由于图像过大或者在不同图像中处理不同的维度我们可能希望可以将图像的大小重新调整。函数cv2.resize()的参数和方法介绍常用参数:src: 输入图像dsize变化后的尺寸fxfy沿x轴y轴方向的缩放比例nterpolation中文意思是插值表示使用什么算法来对图像进行改变,默认值为cv2.INTER_LINEARcv2.INTER_NEAREST:最近邻插值cv2.INTER_LINEAR:双线性插值默认值cv2.INTER_CUBIC:双三次插值cv2.INTER_AREA:使用像素面积关系重采样。图像变化时的首选方法cv2.INTER_LANCZOS4:8x8 邻域的 Lanczos 插值cv2.INTER_MAX插值代码的掩码cv2.WARP_FILL_OUTLIERS:标志填充所有目标图像像素。如果其中一些对应于源图像中的异常值则将它们设置为零cv2.WARP_INVERSE_MAP:标志逆变换#调整图像的大小resized_imagecv2.resize(srcimage,dsize(1200,600))plt.imshow(resized_image)plt.show()4.识别颜色的十六进制值首先我们将定义一个函数它可以为我们提供我们将识别的颜色的“十六进制”值。#{:02x}.format 表示转化为16进制defRGB2HEX(color):return#{:02x}{:02x}{:02x}.format(int(color[0]),int(color[1]),int(color[2]))5.图像读取KMeans 期望在拟合模型中以一维数组作为输入。因此我们需要使用 numpy 重塑图像。然后我们可以先应用 KMeans 进行拟合然后在图像上进行预测以获得结果。然后识别出以正确顺序排列的簇颜色。我们将颜色绘制为饼图。我将两个方法中的所有步骤结合起来。defget_image(image_path):imagecv2.imread(image_path)imagecv2.cvtColor(image,cv2.COLOR_BGR2RGB)returnimage6.获取颜色函数KMeans()的参数和方法介绍常用参数:n_clusters: 即k值max_iter 最大的迭代次数n_init用不同的初始化质心运行算法的次数,默认值是10一般不需要修改除非k值很大init 即初始值选择的方式random完全随机选择k-means优化过的选择方式默认algorithm{‘auto’, ‘full’,‘elkan’},默认是‘auto’full传统的K-Means算法elkan是elkan K-Means算法auto则会根据数据值是否是稀疏的来决定如何选择‘full’和‘elkan’。一般数据是稠密的那么就是 ‘elkan’否则就是‘full’。random_state: 表示产生随机数的方法defget_colors(image,number_of_colors,show_chart):modified_imagecv2.resize(image,(600,400),interpolationcv2.INTER_AREA)#调整图片大小modified_imagemodified_image.reshape(modified_image.shape[0]*modified_image.shape[1],3)#将原有数组转化为一个新数组clfKMeans(n_clustersnumber_of_colors)#k均值聚类labelsclf.fit_predict(modified_image)#利用训练好的模型进行预测countsCounter(labels)#统计每个元素出现的次数并返回一个字典center_colorsclf.cluster_centers_# 我们通过遍历 keys() 来获得有序颜色ordered_colors[center_colors[i]foriincounts.keys()]hex_colors[RGB2HEX(ordered_colors[i])foriincounts.keys()]rgb_colors[ordered_colors[i]foriincounts.keys()]if(show_chart):#如果参数为“show_chart”为“TRUE”则运行此行代码plt.figure(figsize(8,6))plt.pie(counts.values(),labelshex_colors,colorshex_colors)returnrgb_colors get_colors(get_image(sample_image.jpg),8,True)plt.show()7.使用 Color 搜索图像从上面的模型中我们可以提取主要颜色。这创造了基于特定颜色搜索图像的机会。我们可以选择颜色如果它是十六进制匹配或接近图像主要颜色的十六进制我们说这是一个匹配。我们首先获取所有图像并将它们存储在 images 变量中。IMAGE_DIRECTORYimagesCOLORS{GREEN:[0,128,0],BLUE:[0,0,128],YELLOW:[255,255,0]}images[]#os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表forfileinos.listdir(IMAGE_DIRECTORY):ifnotfile.startswith(.):#.startswith判断一个文本是否以某个或几个字符开始结果以True或者False返回,相似函数有endwithimages.append(get_image(os.path.join(IMAGE_DIRECTORY,file)))# 我们现在可以看到所有图像。plt.figure(figsize(20,10))foriinrange(len(images)):plt.subplot(1,len(images),i1)#把显示界面分割成a×b×c的网格plt.imshow(images[i])8.定义函数匹配颜色我们定义下面的函数。尝试匹配图像的前10种颜色。但十六进制代码很可能没有相应的匹配因此我们计算所选颜色和图像颜色之间的相似性。我们保留一个阈值使得如果所选颜色与任何所选颜色之间的差异小于该阈值我们将认为匹配成功。无法直接比较十六进制值或RGB值因此我们首先将它们转换为设备独立且颜色均匀的空间。我们使用rgb2lab来转换值然后使用deltaE_cie76找到差异。使用该方法计算图像的所有前5种颜色与所选颜色之间的差异如果低于阈值我们显示图像。defmatch_image_by_color(image,color,threshold60,number_of_colors10):image_colorsget_colors(image,number_of_colors,False)#调用之前定义的函数selected_colorrgb2lab(np.uint8(np.asarray([[color]])))#rgb2lab()RGB颜色空间转换为LAB颜色空间select_imageFalseforiinrange(number_of_colors):curr_colorrgb2lab(np.uint8(np.asarray([[image_colors[i]]])))#deltaE_cie76: 颜色之间的差值diffdeltaE_cie76(selected_color,curr_color)if(diffthreshold):select_imageTruereturnselect_image9.匹配颜色我们将上述方法用于我们集合中的所有图像并显示与我们所选颜色大致匹配的相关颜色。defshow_selected_images(images,color,threshold,colors_to_match):index1foriinrange(len(images)):selectedmatch_image_by_color(images[i],#调用之前定义的函数color,threshold,colors_to_match)if(selected):plt.subplot(1,5,index)plt.imshow(images[i])index110.选择颜色10.1 只选择绿色# 只选择绿色plt.figure(figsize(20,10))show_selected_images(images,COLORS[GREEN],60,5)10.2 只选择蓝色# 只选择蓝色plt.figure(figsize(20,10))show_selected_images(images,COLORS[BLUE],60,5)10.3 只选择黄色颜色# 只选择黄色颜色plt.figure(figsize(20,10))show_selected_images(images,COLORS[YELLOW],60,5)总结在本实验中我们使用KMeans从图像中提取大多数颜色。然后我们使用 RGB 颜色值来识别图像中的具体颜色。
RELATED

相关推荐

大模型蒸馏小模型:端侧部署的工程实践指南

大模型蒸馏小模型:端侧部署的工程实践指南

1. 项目概述:用一个大模型“教”小模型,到底行不行?“Can We Use One Big Model To Train Smaller Models?”——这个标题乍看像一句学术设问,但背后藏着当前工业界最务实、也最烧脑的落地命题:我们花几百万美元训出来…

📅 2026/9/14 15:20:52
GAN入门实战:从像素级对抗到MNIST手写数字生成

GAN入门实战:从像素级对抗到MNIST手写数字生成

1. 这不是“高不可攀”的黑科技,而是一场像素级的猫鼠游戏Generative Adversarial Networks(GANs)——光看这个名字,很多人第一反应是“又一个被论文包装过的概念”,或是“这玩意儿离我做PPT、写周报、修图、剪视频到底…

📅 2026/9/18 1:04:22
MPC862程序流追踪与硬件调试:从原理到实战解决嵌入式通信系统难题

MPC862程序流追踪与硬件调试:从原理到实战解决嵌入式通信系统难题

1. MPC862程序流追踪:从硬件原理到实战调试在嵌入式通信系统的开发里,最让人头疼的莫过于程序“跑飞”了。你看着板子上的指示灯乱闪,串口输出一堆乱码,但就是不知道CPU到底执行了哪条指令、在哪个分支上出了问题。尤其是在像MPC8…

📅 2026/9/30 5:08:13
MORE NEWS

更多资讯

📰

段式内存管理地址变换与越界检查:课堂练习4.1复盘

课堂练习4.1 的题目发下来的时候,我第一反应是这题应该不难——段式内存管理翻来覆去就那几个公式:拆地址、查段表、做检查、加基址。结果真拿起笔算第一道小题,还是卡了两分钟。卡的点不在于公式本身,而在于题干给的那组数字里藏…

📰

基于YOLOv8的舰船目标检测系统:从数据集标注到PyQt5界面集成

舰船目标检测这个方向,我前后折腾过三套方案,从最早的 YOLOv5 改配置文件,到后来用 YOLOv8 重新搭一套带界面的完整系统,中间踩的坑足够写一本小册子。很多人第一次接触这类项目,会觉得"不就是拿个预训练权重跑一…

📰

JMeter实战入门:以飞致云平台为靶标快速掌握接口测试核心技能

1. 为什么飞致云平台成了JMeter入门的“黄金练兵场”很多人第一次打开JMeter,面对空白的测试计划树和密密麻麻的线程组、HTTP请求、断言、监听器,第一反应是:这玩意儿到底在测什么?测谁?测完又怎么知道对不对&#xff…

📰

Mac读写NTFS移动硬盘的三种实用方案:从驱动到exFAT

朋友抱着一块移动硬盘来找我:“这个盘在Windows上拷满了资料,插到你Mac上试试能不能读?”我接过硬盘插上去,系统确实认出了分区,可当我试着往盘里拖新文件夹时,Mac直接弹窗拒绝。这块盘是NTFS格式&#xff…

📰

逐行拆解one-skill-to-rule-them-all的bash脚本:ID推导、归档扫描,以及你必须防住的三种静默失败

逐行拆解one-skill-to-rule-them-all的bash脚本:ID推导、归档扫描,以及你必须防住的三种静默失败 【免费下载链接】one-skill-to-rule-them-all The meta-skill that builds and improves all your skills, including itself. Watches your work session…

📰

银河麒麟v10 SP1安装Docker:前置问题、内核参数与离线部署指南

简介:银河麒麟V10 SP1 Server上安装Docker的实操手册,面向国产化服务器环境下的运维与开发人员,专门解决官方源未收录Docker服务端软件包、直接yum安装失败的问题。资料包含一个docx格式文档,压缩包体积仅17KB,篇幅短小…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬