一个简单的想法是计算HSV color space 中的饱和度和值(亮度)通道的平均值。然后,只需为这两个值设置一些阈值来区分这两个类。
这是高亮度低饱和度的Lenna:
这是低亮度高饱和度的 Lenna:
一些代码 sn-p 使用OpenCV 完成上述任务:
import cv2
# Read images
img_hv_ls = cv2.imread('Lenna_high_brightness_low_saturation.png')
img_lv_hs = cv2.imread('Lenna_low_brightness_high_saturation.png')
# Calculate means in HSV color space
mean_hv_ls = cv2.mean(cv2.cvtColor(img_hv_ls, cv2.COLOR_BGR2HSV))
mean_lv_hs = cv2.mean(cv2.cvtColor(img_lv_hs, cv2.COLOR_BGR2HSV))
# Put information on images
font = cv2.FONT_HERSHEY_DUPLEX
cv2.putText(img_hv_ls, 'Mean brightness: ' + '{:.4f}'.format(mean_hv_ls[2]/255), (10, 30), font, 1, (0, 0, 0), 1)
cv2.putText(img_hv_ls, 'Mean saturation: ' + '{:.4f}'.format(mean_hv_ls[1]/255), (10, 60), font, 1, (0, 0, 0), 1)
cv2.putText(img_lv_hs, 'Mean brightness: ' + '{:.4f}'.format(mean_lv_hs[2]/255), (10, 30), font, 1, (255, 255, 255), 1)
cv2.putText(img_lv_hs, 'Mean saturation: ' + '{:.4f}'.format(mean_lv_hs[1]/255), (10, 60), font, 1, (255, 255, 255), 1)
cv2.imshow('High brightness, low saturation', img_hv_ls)
cv2.imshow('Low brightness, high saturation', img_lv_hs)
cv2.waitKey(0)
cv2.destroyAllWindows()
而且,这就是输出:
现在,检查图像的代表性(子)集,并根据实际图像分类的饱和度和亮度平均值推断出适当的阈值。
希望有帮助!