图片聚类——k-means算法的python实现

1.前言

这篇文章是基于k-means算法进行图片聚类,而不是对单个图片的像素聚类,分别基于RGB、HSV和HOG特征进行聚类分析。

2.图片特征提取——RGB

RGB为图片最基本的特征,但很多时候RGB颜色空间并不能很好的作为图片聚类的聚簇依据,通常不符合人们对颜色相似性的主观判断,我尝试了用RGB进行聚类,但是效果并没有其他两种好。 其实现代码如下:

def get_rgb_hist_feature(image_name):
    hist_feature = []
    img = cv2.imread(image_name)
    color = ('b', 'g', 'r')
    for index, value in enumerate(color):
        hist = cv2.calcHist([img], [index], None, [256], [0, 256])
        cv2.normalize(hist, hist, 0, 255, cv2.NORM_MINMAX)
        hist_feature.append(hist)
    return list(np.array(hist_feature).ravel())

分别提取RGB颜色空间,最终返回列表。

3.图片特征提取——HSV

hsv能够简单的描述一张图片颜色的全局分布,适用于那些难以自动分割、不需要考虑物体空间位置的图像。hsv的三个分量分别为:色彩(Hue)、饱和度(Saturation)、值(Value)。 其代码实现如下:

def get_hsv_hist_feature(image_name):
    hist_feature = []
    img = cv2.imread(image_name)
    img = cv2.resize(img, (256, 256))
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

    hist_h = cv2.calcHist([hsv], [0], None, [180], [0, 180])
    hist_h = cv2.normalize(hist_h, hist_h)
    hist_feature[0:180] = hist_h[:,0]

    hist_s = cv2.calcHist([hsv], [1], None, [256], [0, 256])
    hist_s = cv2.normalize(hist_s, hist_s)
    hist_feature[180:436] = hist_s[:,0]

    hist_v = cv2.calcHist([hsv], [2], None, [256], [0, 256])
    hist_v = cv2.normalize(hist_v,hist_v)
    hist_feature[436:692] = hist_v[:,0]

    return list(np.array(hist_feature).ravel())

在hsv特征中,每个分量都有自己的取值范围,在提取特征时需要注意列表长度。

4.图片特征提取——HOG特征

HOG特征检测算法实现的几个步骤:颜色空间归一化、梯度计算、梯度方向直方图、重叠块直方图归一化、HOG特征。 其实现代码如下:

def get_hog_feature(image_name):
    img = cv2.imread(image_name)
    img = cv2.resize(img, (256, 256))
    gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    hog_feature = feature.hog(gray_image, orientations=8, pixels_per_cell=(16, 16),
                    cells_per_block=(1, 1))
    return list(hog_feature.ravel())

    原文作者:聚类算法
    原文地址: https://blog.csdn.net/roguesir/article/details/74283268
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞