优化面向色弱可访问性的图像蓝色程度评分算法:排除非蓝色像素并优先覆盖度的技术求助
面向色弱可访问性的图像蓝色程度评分算法:排除非蓝色像素并优先覆盖度的技术求助
我自己是色弱,最近在做一个面向色弱群体的可访问性项目——开发Python脚本根据「蓝色程度」给图像排名。我的核心需求是优先选择蓝色区域大的图像,而非只有小范围高饱和蓝色斑点的图像。但折腾了好久还是遇到了问题:灰色、白色这类完全没有蓝色的图像,居然因为蓝色通道的残留数值,评分比真正带蓝色的图像还高。
具体问题
我现在用「覆盖度+强度」的综合公式计算评分,但像image20.png这种完全没有蓝色的灰度图(像素值比如(100,100,100)),明明覆盖度是0%、强度25%,评分却排在有5%蓝色覆盖度的image127.png前面。
核心评分规则
我设定的评分逻辑是这样的:
- 覆盖度:蓝色占主导且亮度足够的像素占总像素的百分比
- 强度:仅针对符合条件的蓝色像素,计算其蓝色通道的平均值
- 综合评分:
0.9 * 覆盖度 + 0.1 * 强度——重点优先覆盖度
当前实现代码
from PIL import Image import numpy as np def average_blue_intensity(image_path): img = Image.open(image_path).convert('RGB') img_array = np.array(img).astype(np.int16) red, green, blue = img_array[:, :, 0], img_array[:, :, 1], img_array[:, :, 2] mask = (blue > red + 40) & (blue > green + 40) & (blue > 100) return np.mean(blue[mask]) / 255 if np.any(mask) else 0 def blue_coverage(image_path): # ... (和上面用的是同一个掩码逻辑) return np.mean(mask) # 综合评分计算 combined_scores = {path: 0.9 * coverage + 0.1 * intensity ...}
我已经尝试过的调试方法
- 收紧阈值:要求蓝色通道值必须比红、绿通道高40个单位,且蓝色值本身大于100
- 像素级调试:确认image20.png确实没有符合条件的蓝色像素,全是灰度值接近的像素
- 掩码可视化:生成调试图来验证掩码的准确性,确保没把非蓝色像素误判进去
诡异的输出结果
- image20.png(无蓝色)的评分居然高于image127.png(5%蓝色覆盖)
- 具体输出:
1. image20.png - Score: 0.0999 (Coverage: 0.00%, Intensity: 24.97%) 2. image127.png - Score: 0.0964 (Coverage: 5.23%, Intensity: 16.26%)
求助问题
请问怎么优化这个算法,才能彻底排除灰色、白色这类非蓝色像素,让评分真正反映图像的蓝色主导程度?
备注:内容来源于stack exchange,提问作者Dilubar
相关产品推荐
相关产品推荐

