基于机器学习的图像颜色识别
2026/6/25 12:49:27 网站建设 项目流程

文章目录

  • 前言
  • 一、实验主要使用的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 numpy==1.19.5!pip install scikit-learn==0.24.2!pip install opencv-python==4.1.1.26
fromsklearn.clusterimportKMeansimportmatplotlib.pyplotaspltimportnumpyasnpimportcv2fromcollectionsimportCounterfromskimage.colorimportrgb2lab,deltaE_cie76importos# 解压数据集importzipfilewithzipfile.ZipFile('./color_identify.zip')asf:f.extractall()%matplotlib inline

2.使用 OpenCV 读取图像

让我们首先使用OpenCV读取一个示例图像,并了解我们可以对其进行的基本操作。

2.1 使用OpenCV读取图像

#读取图像image=cv2.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。

#读取图像的色域image=cv2.cvtColor(image,cv2.COLOR_BGR2RGB)plt.imshow(image)plt.show()

2.3 将图像转换为灰度图

如果需要,图像也可以转换为灰度。

#将图像转化为灰度图gray_image=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)plt.imshow(gray_image,cmap='gray')plt.show()

3.对图像进行resize重新调整大小

由于图像过大,或者在不同图像中处理不同的维度,我们可能希望可以将图像的大小重新调整。
函数cv2.resize()的参数和方法介绍:
常用参数:

src: 输入图像

dsize:变化后的尺寸

fx,fy:沿x轴,y轴方向的缩放比例

nterpolation:中文意思是插值,表示使用什么算法来对图像进行改变,默认值为cv2.INTER_LINEAR

cv2.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_image=cv2.resize(src=image,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):image=cv2.imread(image_path)image=cv2.cvtColor(image,cv2.COLOR_BGR2RGB)returnimage

6.获取颜色

函数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_image=cv2.resize(image,(600,400),interpolation=cv2.INTER_AREA)#调整图片大小modified_image=modified_image.reshape(modified_image.shape[0]*modified_image.shape[1],3)#将原有数组转化为一个新数组clf=KMeans(n_clusters=number_of_colors)#k均值聚类labels=clf.fit_predict(modified_image)#利用训练好的模型进行预测counts=Counter(labels)#统计每个元素出现的次数,并返回一个字典center_colors=clf.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(),labels=hex_colors,colors=hex_colors)returnrgb_colors get_colors(get_image('sample_image.jpg'),8,True)plt.show()

7.使用 Color 搜索图像

从上面的模型中,我们可以提取主要颜色。

这创造了基于特定颜色搜索图像的机会。

我们可以选择颜色,如果它是十六进制匹配或接近图像主要颜色的十六进制,我们说这是一个匹配。

我们首先获取所有图像并将它们存储在 images 变量中。

IMAGE_DIRECTORY='images'COLORS={'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),i+1)#把显示界面分割成a×b×c的网格plt.imshow(images[i])

8.定义函数匹配颜色

我们定义下面的函数。尝试匹配图像的前10种颜色。

但十六进制代码很可能没有相应的匹配,

因此我们计算所选颜色和图像颜色之间的相似性。

我们保留一个阈值,使得如果所选颜色与任何所选颜色之间的差异小于该阈值,我们将认为匹配成功。

无法直接比较十六进制值或RGB值,因此我们首先将它们转换为设备独立且颜色均匀的空间。

我们使用rgb2lab来转换值,然后使用deltaE_cie76找到差异。

使用该方法计算图像的所有前5种颜色与所选颜色之间的差异,如果低于阈值,我们显示图像。

defmatch_image_by_color(image,color,threshold=60,number_of_colors=10):image_colors=get_colors(image,number_of_colors,False)#调用之前定义的函数selected_color=rgb2lab(np.uint8(np.asarray([[color]])))#rgb2lab():RGB颜色空间转换为LAB颜色空间select_image=Falseforiinrange(number_of_colors):curr_color=rgb2lab(np.uint8(np.asarray([[image_colors[i]]])))#deltaE_cie76: 颜色之间的差值diff=deltaE_cie76(selected_color,curr_color)if(diff<threshold):select_image=Truereturnselect_image

9.匹配颜色

我们将上述方法用于我们集合中的所有图像,并显示与我们所选颜色大致匹配的相关颜色。

defshow_selected_images(images,color,threshold,colors_to_match):index=1foriinrange(len(images)):selected=match_image_by_color(images[i],#调用之前定义的函数color,threshold,colors_to_match)if(selected):plt.subplot(1,5,index)plt.imshow(images[i])index+=1

10.选择颜色

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 颜色值来识别图像中的具体颜色。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询