用CorelDRAW插件从图片中提取色彩

【共享插件017】色彩提取.cdr文档打开后,如警告有宏,选择“启用宏”,用户界面跳出:


714456f7496032f875a9448206bf.jpg


如无提示也无用户界面出现,请修改CorelDRAW的安全等级为“中”。插件使用的有关设置参见作者以往发布的001~014号插件。

文档的前两个页面为作者制作的六个色彩提取案例。


aa5b56f749966ac725794896754f.jpg


456956f749b06ac7257948ab253a.jpg


可以把右侧的提取色块删除掉,以便给新生成的提取色块腾出地方。

在场景中选中一个源图,然后点击“Load Pic”按钮,源图出现在按钮下方,表示图片加载成功,同时执行按钮“Go!”变为可用状态。


d08556f74a076ac72579489809f6.jpg


简单介绍一下色彩提取的原理。

这里用的是一种最简单的聚类技术,即“K-Means”聚类。用户指定要提取的色彩数量,填在“色彩数”输入框里,如5种。图片中所有的像素即被分为5类。分类依据是把色彩的RGB值当成一个三维空间(即色彩空间)内的坐标,依次计算各像素色彩的坐标与5个分类中心的距离,然后归入最近的那个类。

分类中心怎么确定呢?最初是系统给定的,有两种方式:明度序列和色相序列,即面板上“明度”和“色相”两个选项。选“明度”时,得到的初始分类中心是从白到黑5种灰度;选“色相”时,是均布在色相环上的5种彩色。

第一次归类计算后,每个分类中心旗下各聚敛了一批像素。对这些像素的色彩空间坐标求平均,也就是把N个X坐标值加起来除以N,得到一个新的X值。Y和Z也一样处理。最后每个类可以计算出一个新的坐标,即新的分类中心。

以这个新的分类中心对图片像素进行重新分类。该过程循环进行若干次,直到分类中心不再发生变化,此时5个分类中心即提取出来的5种色彩,各类中的像素数代表了该色在图像中所占的比例值。

实验表明,对一般图片15次循环后分类中心的色彩变化已经小到肉眼无法觉察,因此本插件只计算15次。

选择“色相”模式的初始分类中心,色彩提取结果有时会不足数,几种色彩类别的像素数量为零,所以实际提取出的色彩数比指定的数字要少。

点击按钮“Go!”,上述过程被启动。

色彩提取完成后,以两种形式输出。一种是显示在用户界面上,“Go!”按钮下方的色标区,色标的高度表示该色类中的像素数量:


2b7656f74a316ac72579481145fa.jpg


另一种是显示在源图右侧:


68bb56f74a4f32f875a944d8db42.jpg


方块面积表示该色类中的像素数量。所有色块拼成一个与源图等大的方块,可以直观地看出每种色彩所占的比例大小。色彩比例是经过排序的,从左到右、从上到下递减,右下角的色彩比例最小。画色块时,程序自动忽略像素数为零的色彩。

程序会自动判断源图是landscape(横的)还是portrait(竖的),并给出相应的色块画法,主要目的是让色块的长宽尺寸不要相差太大。

下图是portrait式源图的色标,可以看到,第一个色块(代表占比最大的色彩)在上方而不是左侧,因为画在左侧它会变得细长而让用户失去了对面积的准确感知。


55c256f74a786ac725794884237f.jpg


其实这个插件的大部分代码都是013号插件“织毛衣”里直接搬来的,只有色标的画法加了点小创意。

很多软件都提供了从图像中提取色彩的功能,有些网站上还可以在线取色。我们编写这个插件的主要兴趣还是在提取色的应用,就像今天早晨我看到的这个咖啡杯的图案。


4bcd56f74a9732f875a9449a5040.jpg


用户界面左下方的“制作条纹”按钮在一个新建立的页面上制作100条宽度随机的横条纹,下图是它们刚做好没上色的样子。


923656f74abc6ac7257948eab790.jpg


用当前提取色给这些条纹上色之前需要一个预备动作:点击“选当前页”按钮激活“上色”按钮。这是一个安全措施,因为上色按钮会修改当前页内所有对象的色彩,误按的后果比较严重,无法用Ctrl+Z取消。因此设置这样一个强迫用户选择当前页的动作。

上色后的条纹。


17c256f74ad932f875a9444c29c1.jpgc32d56f74ae76ac72579482244b7.jpg

0e3756f74b0a32f875a94444eb10.jpg48f956f74b176ac72579489d9b48.jpg


条纹上色有两条规则:一是按照色彩比例来分配每一种色彩出现的概率;二是相邻的条纹色彩相同时,其中一个条纹被改为白底色以避免同色相邻。

上色完成后,“上色”按钮变回不可用状态。