Python圖片顏色特征提取——HSV中心距法(附代碼及注釋)


顏色矩是個啥?

  首先讓我們先了解一下顏色矩是什么,以下是顏色矩的定義及數學表達,看着唬人但其實並不難

  顏色矩是一種簡單有效的顏色特征表示方法,有一階矩(也就是均值,mean)、二階矩(也就是標准差, variance)和三階矩(斜度,skewness)等,由於顏色信息主要分布於低階矩中,所以用一階矩,二階矩和三階矩足以表達圖像的顏色分布,顏色矩已證明可有效地表示圖像中的顏色分布。

 

 

  其中,Pij 表示彩色圖像第j個像素的第i個顏色分量,N表示圖像中的像素個數。

  圖像的三個分量Y,U,V圖像的前三階顏色矩組成一個9維直方圖向量,即圖像的顏色特征表示如下:

 

Python實現(附代碼及詳細注釋)

  HSV 中心距法是基於HSV空間的,因此需要將RGB空間轉換為HSV空間

def color_moments(filename):
    img = cv2.imread(filename)  # 讀一張彩色圖片
    if img is None:
        return
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)  # RGB空間轉換為HSV空間
    h, s, v = cv2.split(hsv)
    color_feature = []  # 初始化顏色特征
# 一階矩(均值 mean)
    h_mean = np.mean(h)  # np.sum(h)/float(N)
    s_mean = np.mean(s)  # np.sum(s)/float(N)
    v_mean = np.mean(v)  # np.sum(v)/float(N)
    color_feature.extend([h_mean, s_mean, v_mean])  # 一階矩放入特征數組
# 二階矩 (標准差 std)
    h_std = np.std(h)  # np.sqrt(np.mean(abs(h - h.mean())**2))
    s_std = np.std(s)  # np.sqrt(np.mean(abs(s - s.mean())**2))
    v_std = np.std(v)  # np.sqrt(np.mean(abs(v - v.mean())**2))
    color_feature.extend([h_std, s_std, v_std])  # 二階矩放入特征數組
# 三階矩 (斜度 skewness)
    h_skewness = np.mean(abs(h - h.mean()) ** 3)
    s_skewness = np.mean(abs(s - s.mean()) ** 3)
    v_skewness = np.mean(abs(v - v.mean()) ** 3)
    h_thirdMoment = h_skewness ** (1. / 3)
    s_thirdMoment = s_skewness ** (1. / 3)
    v_thirdMoment = v_skewness ** (1. / 3)
    color_feature.extend([h_thirdMoment, s_thirdMoment, v_thirdMoment])  # 三階矩放入特征數組

    return color_feature

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM