Python 重构问题

Python 重构问题,直接用produce()函数比较所有像素和颜色显然不可取,毕竟1000万个像素只有20万种颜色。要把源色彩映射到目标色彩,只要将这20万种颜色保存在一个表中即可。

具体实现方法如下。

(1) 计算源色彩到目标色彩的映射,这里使用3比特表示输出值。R、G、B三个量中,每个的8种可能取值用range(0, 256, 32)表示。枚举所有输出值的表达式如下:product(range(0, 256, 32), range(0, 256, 32), range(0, 256, 32))

(2) 然后计算源色彩表中与最近颜色的欧氏距离,共需68096次计算,耗时约0.14秒。这个步骤只需执行一次,生成20万个映射。

(3) 对图像做一次性处理,基于修正后的颜色表生成新图像。这里利用整数截断方法,通过类似于(0b11100000 & r, 0b11100000 & g, 0b11100000 & b)这样的表达式去掉颜色中不太重要的比特,后面的计算中还会用到该方法。

这样就将一个十亿级的欧氏距离计算转化为千万级的查表运算,耗时从30分钟降至30秒左右。

采用生成从源色彩到目标色彩的静态映射表,而不是对每个像素进行颜色映射,就建立了从原始颜色到新颜色的简单映射关系。

有了这个包含20万种颜色的色彩表,就可以通过它计算曼哈顿距离,确定相对于某种输出(例如蜡笔色彩)的最接近颜色了。用前面讲过的色彩匹配算法计算映射关系而不是结果图像,最主要的区别是用palette.keys()函数代替pixel_iter()函数。

稍后会介绍另一项优化技术——截断,用以加速算法。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程