当前位置: 首页 > 科技观察

如何通过机器学习还原图像颜色

时间:2023-03-21 16:34:13 科技观察

在这篇文章中,作者提出了使用k-means算法来还原图像的颜色,介绍了该算法的步骤,同时将其应用于图像.通过对比复原前后的图像,证明了k-means算法的有效性。k-means是机器学习中最流行和使用最广泛的算法之一。在这篇文章中,k-means算法将用于减少图像上的颜色(但不是像素),从而也减小图像的大小。这方面不需要任何基础知识,因为可执行应用程序文件(大小为150MB,由于长期依赖Spark)已经提供了友好的用户界面。因此,您可以轻松地尝试不同的图像。GitHub上提供了完整的实现代码。K-Means算法k-means算法是一种无监督学习算法,它将相似的数据分成不同的类别或簇。它是一种无监督算法,因为数据没有标记,并且该算法不需要反馈来对相似数据进行分类(可能是预期类别的数量-稍后会详细介绍)。应用k-means算法的一些应用程序包括客户服务、集群计算、社交网络和天文数据分析。客户服务假设您拥有大量有关客户的数据,并希望更多地了解您拥有的客户类型,以便更好地为特定群体提供服务。也许您正在制作牛仔裤和T恤,因此您需要根据特定国家/地区的体型对人们进行分组,以便您知道制作哪种尺码更好。集群计算从性能的角度来看,最好将某些计算机组合在一起;例如,从网络的角度来看,交换机适合集群在一起工作,或者提供类似的计算服务。K-means算法可以将功能相似的计算机分组在一起,从而可以进行更好的布局和优化。社交网络在社交网络中,您可以根据关系、偏好、相似性等对客户进行分组,从营销角度更好地定位客户。基于提供的数据的输入,k-means算法可以帮助我们从不同的角度对相同的数据进行分类。天文数据分析k-means也被用来理解星系的形成,并在天文数据中寻找凝聚力。工作原理k-means算法有两个步骤。假设数据分为四组,执行以下步骤。注意:在开始任何步骤之前,k-means算法从数据中随机抽取三个样本,称为聚类中心。它检查每个数据样本,并根据它们与从一开始就随机选择的聚类中心的相似程度对它们进行分类。它使聚类中心更接近相似的同类点(在步骤1中分组)。重复这些步骤,直到聚类中心没有明显移动。下面使用简单数据进行算法执行。步骤1现在继续说明步骤1是如何实现的。如果您不熟悉多维特征数据。首先,我们引入一些变量:k:聚类的个数Xij:样本i的第j个特征值μij:样本i的第j个特征的聚类中心(类似于X,因为聚类中心是随机选择的)在这个中步骤,通过迭代,计算它们与聚类中心的相似度,并将它们归入合适的类别。更准确地说,这是通过采用样本的欧几里德距离并从最小距离选取中心来计算的。由于中心点是随机选择的,所有特征点到中心点的欧几里得距离被求和。或者,更简化和计算量更少:步骤2从图中,这一步将中心点移向步骤1中的相似分组。更准确地说,每个中心的新位置是通过取所有相似点的平均值来计算的到中心点或属于分组(步骤1的分组)。例如,如果第1步之后有4个簇,103个样本,那么结果如下:μ1=20表示编号为1-20的样本的特征中心为20μ2=10表示编号为21-的样本的特征中心31为10μ3=30表示编号为32-62的例子的特征中心为30μ4=40表示编号为63-103的例子的特征中心为40新的计算方法如下:这是所有的平均值数据,类似于特定的中心。重复,重复,重复……什么时候停止?重复步骤1和2,直到中心越来越靠近数据集群,如图所示,从而产生一个新的中心。该算法一直运行到对结果满意为止,然后需要明确告知它才能停止。一种方式是在迭代时,中心体在图中不移动,或者移动得很少。形式上,可以计算成本函数,它基本上是步骤1中计算的平均值:μc是Xi的中心值。每个示例都可以属于不同的组或中心。每次迭代成本都与之前的成本进行比较,如果变化真的很低,就停止它。例如,如果改进(成本函数的差异)为0.00001(或您认为合适的任何其他值),那么您可以停止,因为继续没有意义。算法会出错吗?通常不会,但是众所周知,k-means算法只能实现局部优化,不能实现全局优化。在这种情况下,k-means算法找不到更明显的分组,如下图所示:幸运的是,解决方案相当简单——只需多运行几次k-means算法,然后选择最好的结果即可.这个解决方案很有用,因为在开始时,随机初始化k-means算法,比如运行10次,然后你会得到一个局部最优解。当然,这会增加运行时间,因为它运行了很多次并且只需要一个结果。另一方面,完全可以并行运行该算法,甚至可以在不同的集群上运行,因此它通常可以作为一种解决方案。当然,k-means算法的内容比我介绍的要多,因此强烈推荐这篇文章以获得更深入的见解。算法执行和结果在本节中,您将运行应用程序(您也可以下载代码)并浏览一些细节以了解k-means算法如何用于颜色恢复。关于颜色复原需要说明的是,k-means算法并不是减少图像上的像素,而是通过将相似的颜色组合在一起来减少图像中的颜色数量。普通图像通常有数千种或更多颜色,因此减少颜色数量可以显着减小文件大小。为了说明减少颜色数量如何有助于减小图像大小,让我们看一个示例。假设有一张1280x1024像素的图像,对于每个像素,都有一个简单的颜色表示(RGB24位,8位红色,8位绿色,8位蓝色)。总而言之,表示图像需要1280*1024*24=31457280位或30MB。现在,将整体颜色减少到16意味着用4位代替24位像素来表示16种颜色。现在,有1280*1024*4=5MB,占用的内存少了6倍。当然,图像看起来不会像以前那么好***(现在只有16种颜色),但它一定会找到合适的图像。执行和执行算法最简单的方法是下载JAR包,使用自己的镜像执行(需要安装Java)。在我的计算机上大约需要一分钟才能将颜色降低到16(因为Spark并行运行,高CPU和内存会更好)。在UI中,您可以选择要尝试的图像文件,也可以选择减少图像上的颜色数量。下面是UI和结果的示例:可以注意到,文件大小减少了4倍,但最终图像看起来并没有那么糟糕。多运行几次可能会得到更好的结果。再次尝试24色:这看起来明显更好并且不会增加太多大小(仅0.08MB)。似乎24到28之间的某处是这张图片的最佳视觉效果。虽然结果看起来不错,但选择最佳图像是一项手动任务。毕竟,我们正在执行和挑选视觉上最合适的图像。相信可以通过多种方式解决这个问题。解决方案之一是简单地计算原始图像上的所有颜色,并在此基础上定义用于图像的颜色数量,同时仍保持图像的美观。这个过程可以通过使用线性回归等机器学习预测算法来完成。该算法通过为图像赋予不同的颜色来训练,同时每幅图像看起来仍然不错。在给出一些重要的例子后,该算法学习如何根据不同的图像减少到最大数量的颜色。现在是线性回归算法预测下一张图像的颜色将减少多少的时候了。可以下载代码(https://github.com/klevis/KMeansImageColorReduction)并在JavaIDE上运行它。当然,如果不想在源码中运行,直接下载代码,运行maven:mvncleaninstallexec:java即可。