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
491

被折叠的 条评论
为什么被折叠?



