如何用Python获取HSV图像像素的最少波长分布?
HSV像素转波长比例分布的Python实现
处理规则
基于「最少波长数」的核心要求,制定以下转换逻辑:
- 纯灰度/白色(饱和度S≤0.01):使用红(620nm)、绿(550nm)、蓝(450nm)三个基础波长,各占1/3比例。
- 高饱和度单色(S≥1):根据色相对应单一波长,比例为1:
- 0°≤H<30° → 红(620nm)
- 30°≤H<60° → 橙(590nm)
- 60°≤H<90° → 黄(570nm)
- 90°≤H<150° → 绿(550nm)
- 150°≤H<210° → 青(500nm)
- 210°≤H<270° → 蓝(450nm)
- 高饱和度品红(270°≤H<360°):混合红(620nm)和蓝(450nm),比例随色相线性过渡:
- 红比例 = (H - 270) / 90
- 蓝比例 = (360 - H) / 90
- 低饱和度(0<S<1):拆分「彩色部分(占比S)」和「灰度部分(占比1-S)」,灰度部分拆为三个基础波长各占(1-S)/3,彩色部分按上述单色/品红规则分配比例。
Python代码实现
def hsv_to_wavelength_distribution(h, s, v): # 初始化波长分布字典 dist = {} # 处理纯灰度/白色情况 if s <= 0.01: dist[620] = 1 / 3 dist[550] = 1 / 3 dist[450] = 1 / 3 return dist # 拆分彩色与灰度部分的比例 color_ratio = s gray_ratio = 1 - s # 灰度部分的三个基础波长初始比例 gray_base = gray_ratio / 3 dist[620] = gray_base dist[550] = gray_base dist[450] = gray_base # 根据色相分配彩色部分比例 if 0 <= h < 30: # 红色 dist[620] += color_ratio elif 30 <= h < 60: # 橙色 dist[590] = color_ratio elif 60 <= h < 90: # 黄色 dist[570] = color_ratio elif 90 <= h < 150: # 绿色 dist[550] += color_ratio elif 150 <= h < 210: # 青色 dist[500] = color_ratio elif 210 <= h < 270: # 蓝色 dist[450] += color_ratio elif 270 <= h < 360: # 品红色:混合红与蓝 red_part = (h - 270) / 90 * color_ratio blue_part = (360 - h) / 90 * color_ratio dist[620] += red_part dist[450] += blue_part # 修正浮点误差,确保比例总和严格为1 total = sum(dist.values()) for wavelength in dist: dist[wavelength] /= total return dist
测试示例
- 纯蓝色(H=240, S=1, V=0.8):返回
{450: 1.0} - 品红色(H=300, S=1, V=0.5):返回
{620: 0.3333333333333333, 450: 0.6666666666666666} - 白色(H=0, S=0, V=1):返回
{620: 0.3333333333333333, 550: 0.3333333333333333, 450: 0.3333333333333333} - 低饱和度红色(H=10, S=0.5, V=0.7):返回
{620: 0.6666666666666666, 550: 0.16666666666666666, 450: 0.16666666666666666}
内容的提问来源于stack exchange,提问作者Aromik AR
相关产品推荐
相关产品推荐

