我们已经有了RGB颜色空间,为什么还要去用其它的颜色空间
RGB空间很容易理解,但是当如果你需要去定义一个特定范围的颜色,定义一个颜色的准确的色度是不直观的。HSV颜色空间在定义一个特定的颜色的方面上更加直观,但是HSV对于表示人类看和解释颜色的方面不是很好。于是我们就有了L*a*b颜色空间,这个颜色空间试图去模仿人类观察和解释颜色的方法,在L*a*b颜色空间里面任意两个颜色的欧式距离有着实际的感知的意义
The addition of the perceptual meaning property makes the L*a*b* color space less intuitive and easy to understand than RGB or HSV, but because of the perceptual meaning property, we often use it in computer vision.
用L*a*b颜色空间和K-means聚集算法来寻找一张图片中的dominant colors
argparse是一个用于解析命令的库,ap.add_argument的设定命令里面 -i 和 -c -i后面的内容存在args这个map里面image对应的值,-c后面的内容存在args这个map里面clusters对应的值
把(image.shape[0],image.shape[1],3)的图像reshape成 (image.shape[0] * image.shape[1], 3)的一维数组
KMeans 是无监督学习的方法:https://blog.csdn.net/u013850277/article/details/88411966
utils是项目目录中的utils.py
sklearn里面KMeans的说明:https://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html#examples-using-sklearn-cluster-kmeans]
KMeans返回的对象里面有labels_ 和 cluster_centers_变量,labels就是每个元素所属类的标号
numLabels 是形成整数数组 0,1,...,clt.lablels_的不同种类的个数
numpy的histogram函数:https://blog.csdn.net/yangwangnndd/article/details/89489946
https://docs.scipy.org/doc/numpy/reference/generated/numpy.histogram.html
后面要将histogram里面的数 规范化 使得里面的所有数加起来为1(为啥鸭??)
看到后面的plot_colors就明白了,规范化的目的是把出现的数量转化成概率,感觉直接在histogram函数里面加上density = True就可以了
bar就是形成一个50*300的图,然后根据hist里面每个数据的出现概率和数据所代表的类centroids(其实质心就是颜色)
因为这个图里面的颜色很均一 所以质心其实就是这个颜色
endX 根据数据出现的比例 来画图
https://www.pyimagesearch.com/2014/05/26/opencv-python-k-means-color-clustering/ 里面有作者的解释
吐槽一下 这个代码跟L*a*b 感觉没有一毛钱关系啊!!!
改一下命令行的参数 康一康 如果将类的个数设置成2
类的个数设置成4:
把K = 3的时候 质心的位置打印一下:
我想自己试试转成LAB来进行KMeans
貌似(1,1,3)的单个像素是不能进行转化的