Python实战:HSV色相环中冷暖色调的精确角度范围解析

张开发
2026/4/6 2:33:27 15 分钟阅读

分享文章

Python实战:HSV色相环中冷暖色调的精确角度范围解析
1. HSV色相环与冷暖色调的基础认知第一次接触HSV色彩空间时我也被色相环上那些绚丽的颜色搞得眼花缭乱。HSV中的H代表色相Hue它用一个角度值来表示颜色就像钟表的指针一样0度是红色然后顺时针旋转120度是绿色240度是蓝色最后回到360度又变成红色。这个环形结构就是我们常说的色相环。冷暖色调的划分其实挺有意思的。暖色调通常让人联想到阳光、火焰比如红色、橙色、黄色而冷色调则让人想到水、冰、森林比如蓝色、绿色。但在实际应用中我发现很多资料对冷暖色调的划分非常模糊有的说红色到黄色是暖色有的又说紫色也算暖色搞得人一头雾水。在Python的图像处理中我们常用的HSV取值范围是这样的色相(H)0-180OpenCV的默认范围饱和度(S)0-255明度(V)0-255这里有个坑要注意OpenCV为了节省存储空间把通常的0-360度色相范围压缩到了0-180。所以当我们说90度时在OpenCV里实际是45。2. 冷暖色调的精确角度范围探究经过大量资料查阅和实际测试我发现最靠谱的冷暖色调划分是这样的暖色调范围0°-90°红色到黄色270°-360°品红色到红色冷色调范围90°-270°绿色到蓝色这个划分有几个依据从色相环上看90°-270°这个半圆包含了绿色、青色和蓝色都是典型的冷色Adobe Photoshop的官方文档也采用了类似的划分多篇学术论文在颜色情感分析中都认可这个范围用Python代码表示这个范围转换到OpenCV的0-180范围就是# 暖色调范围 warm_lower1 0 # 0° warm_upper1 45 # 90° warm_lower2 135 # 270° warm_upper2 180 # 360° # 冷色调范围 cool_lower 45 # 90° cool_upper 135 # 270°3. Python实现HSV冷暖色调识别现在我们来写个完整的Python脚本用OpenCV实现图片的冷暖色调分析。这个脚本会读取输入图片转换为HSV色彩空间根据上面确定的范围标记冷暖色调显示结果import cv2 import numpy as np def analyze_color_temperature(image_path): # 读取图片并转换为HSV img cv2.imread(image_path) hsv cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 定义冷暖色调范围 warm_lower1 np.array([0, 50, 50]) warm_upper1 np.array([45, 255, 255]) warm_lower2 np.array([135, 50, 50]) warm_upper2 np.array([180, 255, 255]) cool_lower np.array([45, 50, 50]) cool_upper np.array([135, 255, 255]) # 创建冷暖色调的掩膜 warm_mask1 cv2.inRange(hsv, warm_lower1, warm_upper1) warm_mask2 cv2.inRange(hsv, warm_lower2, warm_upper2) warm_mask cv2.bitwise_or(warm_mask1, warm_mask2) cool_mask cv2.inRange(hsv, cool_lower, cool_upper) # 计算冷暖色调像素比例 total_pixels img.shape[0] * img.shape[1] warm_pixels cv2.countNonZero(warm_mask) cool_pixels cv2.countNonZero(cool_mask) neutral_pixels total_pixels - warm_pixels - cool_pixels print(f暖色调占比: {warm_pixels/total_pixels:.2%}) print(f冷色调占比: {cool_pixels/total_pixels:.2%}) print(f中性色调占比: {neutral_pixels/total_pixels:.2%}) # 可视化结果 result img.copy() result[warm_mask 0] [0, 0, 255] # 暖色标红 result[cool_mask 0] [255, 0, 0] # 冷色标蓝 cv2.imshow(Original, img) cv2.imshow(Color Temperature Analysis, result) cv2.waitKey(0) cv2.destroyAllWindows() # 使用示例 analyze_color_temperature(test_image.jpg)这个脚本中我添加了饱和度(S)和明度(V)的阈值都设为50这样可以过滤掉那些接近灰度的颜色让分析结果更准确。4. 实际应用中的注意事项在实际项目中应用这个方案时我发现有几个容易踩坑的地方颜色空间转换的差异不同库对HSV的取值范围可能不同。比如PIL库的HSV模式中色相范围是0-360而OpenCV是0-180。混用会导致严重错误。光照条件的影响同样的物体在不同光照下HSV值会变化。建议先做白平衡或颜色校正。饱和度阈值的选择我测试发现饱和度低于40的颜色其实已经接近灰色应该算作中性色而不是冷暖色。边缘过渡区域的处理在90°和270°附近的颜色黄绿色和紫红色有时很难明确归类这时可以考虑设置一个过渡区# 过渡区处理示例 transition_width 10 # 过渡区宽度度数 cool_lower np.array([45 transition_width, 50, 50]) cool_upper np.array([135 - transition_width, 255, 255])性能优化处理大图时可以先用cv2.resize缩小尺寸分析得到大致比例后再决定是否处理原图。5. 进阶应用基于冷暖色调的图像情感分析掌握了冷暖色调的精确划分后我们可以做很多有趣的应用。比如分析照片的情感倾向def analyze_image_mood(image_path): # ...前面的颜色分析代码 warm_ratio warm_pixels / total_pixels cool_ratio cool_pixels / total_pixels if warm_ratio 0.7: return 热烈、活力 elif cool_ratio 0.7: return 冷静、平和 elif abs(warm_ratio - cool_ratio) 0.2: return 平衡、和谐 else: return 复杂、多变这个简单的情感分析可以用于相册自动分类、广告效果评估等场景。我在一个摄影社区项目中应用了这个方法用户反馈说自动生成的照片标签准确率很高。另一个应用场景是设计辅助工具自动检查设计稿的冷暖色调平衡。比如网页设计通常建议暖色不超过60%否则可能显得过于刺激。

更多文章