用CorelDRAW插件从图片中提取色彩
【共享插件017】色彩提取.cdr文档打开后,如警告有宏,选择“启用宏”,用户界面跳出:
如无提示也无用户界面出现,请修改CorelDRAW的安全等级为“中”。插件使用的有关设置参见作者以往发布的001~014号插件。
文档的前两个页面为作者制作的六个色彩提取案例。
可以把右侧的提取色块删除掉,以便给新生成的提取色块腾出地方。
在场景中选中一个源图,然后点击“Load Pic”按钮,源图出现在按钮下方,表示图片加载成功,同时执行按钮“Go!”变为可用状态。
简单介绍一下色彩提取的原理。
这里用的是一种最简单的聚类技术,即“K-Means”聚类。用户指定要提取的色彩数量,填在“色彩数”输入框里,如5种。图片中所有的像素即被分为5类。分类依据是把色彩的RGB值当成一个三维空间(即色彩空间)内的坐标,依次计算各像素色彩的坐标与5个分类中心的距离,然后归入最近的那个类。
分类中心怎么确定呢?最初是系统给定的,有两种方式:明度序列和色相序列,即面板上“明度”和“色相”两个选项。选“明度”时,得到的初始分类中心是从白到黑5种灰度;选“色相”时,是均布在色相环上的5种彩色。
第一次归类计算后,每个分类中心旗下各聚敛了一批像素。对这些像素的色彩空间坐标求平均,也就是把N个X坐标值加起来除以N,得到一个新的X值。Y和Z也一样处理。最后每个类可以计算出一个新的坐标,即新的分类中心。
以这个新的分类中心对图片像素进行重新分类。该过程循环进行若干次,直到分类中心不再发生变化,此时5个分类中心即提取出来的5种色彩,各类中的像素数代表了该色在图像中所占的比例值。
实验表明,对一般图片15次循环后分类中心的色彩变化已经小到肉眼无法觉察,因此本插件只计算15次。
选择“色相”模式的初始分类中心,色彩提取结果有时会不足数,几种色彩类别的像素数量为零,所以实际提取出的色彩数比指定的数字要少。
点击按钮“Go!”,上述过程被启动。
色彩提取完成后,以两种形式输出。一种是显示在用户界面上,“Go!”按钮下方的色标区,色标的高度表示该色类中的像素数量:
另一种是显示在源图右侧:
方块面积表示该色类中的像素数量。所有色块拼成一个与源图等大的方块,可以直观地看出每种色彩所占的比例大小。色彩比例是经过排序的,从左到右、从上到下递减,右下角的色彩比例最小。画色块时,程序自动忽略像素数为零的色彩。
程序会自动判断源图是landscape(横的)还是portrait(竖的),并给出相应的色块画法,主要目的是让色块的长宽尺寸不要相差太大。
下图是portrait式源图的色标,可以看到,第一个色块(代表占比最大的色彩)在上方而不是左侧,因为画在左侧它会变得细长而让用户失去了对面积的准确感知。
其实这个插件的大部分代码都是013号插件“织毛衣”里直接搬来的,只有色标的画法加了点小创意。
很多软件都提供了从图像中提取色彩的功能,有些网站上还可以在线取色。我们编写这个插件的主要兴趣还是在提取色的应用,就像今天早晨我看到的这个咖啡杯的图案。
用户界面左下方的“制作条纹”按钮在一个新建立的页面上制作100条宽度随机的横条纹,下图是它们刚做好没上色的样子。
用当前提取色给这些条纹上色之前需要一个预备动作:点击“选当前页”按钮激活“上色”按钮。这是一个安全措施,因为上色按钮会修改当前页内所有对象的色彩,误按的后果比较严重,无法用Ctrl+Z取消。因此设置这样一个强迫用户选择当前页的动作。
上色后的条纹。
条纹上色有两条规则:一是按照色彩比例来分配每一种色彩出现的概率;二是相邻的条纹色彩相同时,其中一个条纹被改为白底色以避免同色相邻。
上色完成后,“上色”按钮变回不可用状态。