图像主色调提取—学习笔记

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值