基于机器学习的图像颜色识别

发布时间:2026/6/25 12:50:23
基于机器学习的图像颜色识别 文章目录前言一、实验主要使用的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 颜色值来识别图像中的具体颜色。