颜色矩
一种非常简单而有效的颜色特征使由Stricker和Orengo所提出的颜色矩(color moments) [7]。这种方法的数学基础在于图像中任何的颜色分布均可以用它的矩来表示。此外,由于颜色分布信息主要集中在低阶矩中,因此仅采用颜色的一阶矩(mean)、二阶矩(variance)和三阶矩(skewness)就足以表达图像的颜色分布。与颜色直方图相比,该方法的另一个好处在于无需对特征进行向量化。
一阶颜色矩——均值,反映图像明暗程度
pij表示第j个像素的第i个颜色通道的值
二阶颜色矩 ——标准差,反映图像颜色分布范围
三阶颜色矩 ——方差,反映图像颜色分布对称性
import cv2
import numpy as np
def color_moment(img):
hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
h,s,v=cv2.split(hsv)
color_feature=[]
h_mean=np.mean(h)
s_mean=np.mean(s)
v_mean=np.mean(v)
color_feature.extend([h_mean,s_mean,v_mean])
h_std=np.std(h)# np.sqrt(np.mean(abs(h - h.mean())**2))
s_std=np.std(s)
v_std=np.std(v)
color_feature.extend([h_std,s_std,v_std])
h_skewness=np.mean((h-h_mean)**3)
s_skewness = np.mean((s - s_mean) ** 3)
v_skewness = np.mean((v - v_mean) ** 3)
h_skewness=np.sign(h_skewness) * abs(h_skewness) ** (1/3)
s_skewness = np.sign(s_skewness) * abs(s_skewness) ** (1 / 3)
v_skewness = np.sign(v_skewness) * abs(v_skewness) ** (1 / 3)
color_feature.extend([h_skewness,s_skewness,v_skewness])
return color_feature
def abs_dst(feature1,feature2):
dst = sum([abs(feature1[i] - feature2[i]) for i in range(len(feature1))])
return dst
if __name__=='__main__':
img1=cv2.imread('lena.jpg')
img2=cv2.imread('test.jpg')
feature1=color_moment(img1)
feature2 = color_moment(img2)
print(abs_dst(feature1,feature2))