# 代码5-2 绘制颜色矩的直方图
def color_moments(img, trans_hsv=False):
if trans_hsv == True:
img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# 颜色分割
f, s, t = cv2.split(img)
# 创建特征存放列表
color_feature = []
# 一阶
f_mean = np.mean(f)
s_mean = np.mean(s)
t_mean = np.mean(t)
color_feature.extend([f_mean, s_mean, t_mean])
# 二阶
f_std = np.std(f)
s_std = np.std(s)
t_std = np.std(t)
color_feature.extend([f_std, s_std, t_std])
# 三阶
f_skewness = np.mean(abs(f - f.mean()) ** 3)
s_skewness = np.mean(abs(s - s.mean()) ** 3)
t_skewness = np.mean(abs(t - t.mean()) ** 3)
f_thirdMoment = f_skewness ** (1. / 3)
s_thirdMoment = s_skewness ** (1. / 3)
t_thirdMoment = t_skewness ** (1. / 3)
color_feature.extend([f_thirdMoment, s_thirdMoment, t_thirdMoment])
return color_feature
img1 = cv2.imread('../data/leaf1.jpg')
img2 = cv2.imread('../data/leaf2.jpg')
img1 = img1[188: 238, 275: 325, :]
img2 = img2[69: 119, 108: 158, :]
# 调用函数获取颜色矩
img1_feature = color_moments(img1)
img2_feature = color_moments(img2)
x = np.arange(9)
labels = [i + j for i in ['一阶', '二阶', '三阶'] for j in ['B', 'G', 'R']]
fs = 15
plt.figure(figsize=(7, 4)) # 设置画布的大小
plt.bar(x - 0.15, img1_feature, width=0.3)
plt.bar(x + 0.15, img2_feature, width=0.3)
plt.xticks(x, labels, fontsize=fs)
plt.xlabel('各阶颜色矩', fontsize=fs)
plt.legend(['leaf1', 'leaf2'])
plt.tight_layout()
# plt.savefig('../tmp/颜色矩.png', dpi=1080)
plt.show()
这段代码是用于绘制颜色矩的直方图。它首先定义了一个color_moments
函数,该函数计算图像的颜色矩特征。然后,它从两张图像中提取颜色矩特征,并将这些特征存储在img1_feature
和img2_feature
变量中。
接下来,代码使用matplotlib
库绘制直方图。它创建一个包含9个条形的图表,分别表示一阶、二阶和三阶的颜色矩特征。通过调用plt.bar
函数,将img1_feature
和img2_feature
的值分别绘制为两组条形。
最后,代码设置x轴的刻度标签和标签字体的大小,以及x轴和y轴的标签。通过调用plt.legend
函数,为图表添加图例。最后,调用plt.show
函数显示图表。
如果你想保存这个图表,可以将注释掉的代码plt.savefig('../tmp/颜色矩.png', dpi=1080)
取消注释,将图表保存为指定路径下的图片文件。