Haishoku
文档
Haishoku
代码
anceGin/haishoku
Haishoku是一个用来获取图片主色调和主要配色方案的Python库,依赖于Python3和pillow。
Finding dominant colors in an image
文档
Finding dominant colors in an image
代码
aishack/dominant-colors
Eigenvectors
-
颜色量化(color quantization)
将图像的数百万的颜色表示量化为只有几种主要色调的颜色表示。
-
分层量化(hierarchical quantization)
首先,假设整个图像由单一颜色组成,然后连续拆分此节点以获得所需数量的颜色。使用二叉树分裂主色,树中的叶节点是主色,每个节点与“类”相关联。当开始时,图像中的每个像素都被初始化为类1,在执行一次分割后,每个像素要么属于类2,要么属于类3。同样,在第二次分割后,每个像素都属于第2类,4或5类。
在下图中,蓝色图像是每个像素都被分配相同类别的结果,代表上图中的第一棵树。然后将这个类分成两个不相交的集合(用红色和绿色表示),然后绿色被分成另外两个节点(黄色和青色),每个类都对应原始图像中的某种颜色(黄色对应原始图像中的灰色,青色对应原始图像中的黑色),但是黄色也有一些肤色和蝙蝠侠标志,下一个拆分处理这个(灰色用洋红色表示,黄色用灰色表示)。
-
类别统计分析(statistics of each class)
类的统计分析一般用均值和方差,对于根节点可以很容易的计算颜色的均值和方差。下面的三个公式可以用来计算均值 q n q_{n} qn和协方差 R ~ n \tilde{R}_{n} R~n。
n n n是我们计算的树的节点, t t t是转置标志,所以树的每个节点都要计算上面的三个参数。 C n C_{n} Cn是 n n n节点中包含的像素数。 X s X_{s} Xs是像素 s s s对应的RGB值。 R n R_n Rn 和 R ~ n \tilde{R}_{n} R~n都是3x1的矩阵。
使用上面的公式可以计算 n n n类的均值。
使用上面的公式和均值可以计算 n n n类的协方差。
-
从哪里分割
通过协方差确定要拆分的类。协方差矩阵反应图像颜色的变化。对于一个色彩丰富的图像,如果只有一个树节点(因为所有的像素都属于同一类),那么协方差矩阵会有不连续的较高的变量值。当拆分后,协方差矩阵的值会变成较小的连续值。使用协方差矩阵,可以计算一个将RGB值分成两个不同部分的平面。特征向量定义方差最大的轴。不同于2D中的特征向量,特征向量不需要像标准坐标空间中那样垂直,特征向量的长度表示幅度。
如上图所示,特征向量是黄色和蓝色的箭头,他们相互不垂直,不与坐标轴(黑色X-Y轴)对齐。但是,黄色特征向量表示“沿该轴存在最大变化”的信息,蓝色特征向量信息表示“沿该轴有些变化,但是它不是最大值”。上面的示例示二维的,当扩展到三维(3D空间中的一组3D矢量),使用最大的特征向量来分割树是有意义的。数据点是RGB值,沿特定轴的方差越大,沿该轴实际存在两种或多种颜色的可能性越大。在实践中用特征向量和特征值这两个量表示。通常,将特征向量归一化为具有单位长度,特征值表示轴的大小或长度。
基于具有最大特征值的特征向量来分割树节点,这个分割可以包含多种颜色,在后续分割中会发现这些颜色。
-
怎么分割
知道分裂的位置在具有最大特征向量的特征值处,如何拆分树节点。假设正在拆分的树节点为 n n n, 变量 C n C_n Cn表示属于该节点的所有像素。 e n e_n en表示具有最大特征值的特征向量,用下面的方法定义新的类别 C n + 1 C_{n+1} Cn+1和 C n + 2 C_{n+2} Cn+2:
该条件将属于节点 C n C_n Cn的像素分成两个不相交的节点因为特征向量在3D空间中定义法线。使用此法线,可以定义一个3D平面,将高方差类分成两个部分。
3D平面的法线是特征向量 e n e_n en,中心的粗线是由 e n q n t e_{n}q^{t}_{n} enqnt定义,要分割的实际数据点是 e n X s t e_{n}X^{t}_{s} enXst,其中 X s X_s Xs是像素 s s s处的 R G B RGB RGB值
Implementation in OpenCV
- Setting up the OpenCV project
- Finding dominant colors
- Statistical functions for detecting primary colors
- Calculating the mean and covariance of each class
- Find the node with the maximum eigenvalue
- Partitioning a class into two
Additional function to view what’s happening
- Tree traversal funtions
- Get a list of all leaves in the tree
- Viewing functions
参考资料
Finding dominant colors in an image–Eigenvectors
Finding dominant colors in an image–Implementation in OpenCV
Finding dominantcolors in an image–Additional functions to view what’s happening