如何在Python 3.12中将RGB值转换为最接近的ANSI颜色代码?
图像转控制台ANSI颜色的正确匹配方案
你之前用RGB三通道之和的差值匹配颜色的方法本质错误——这种方式把三维的RGB颜色空间压缩成一维数值,完全忽略了颜色的实际分布,比如红色(255,0,0)和绿色(0,255,0)的通道和都是255,差值为0,但实际是完全不同的颜色,必然会误判。
以下是两种可行的改进方案,基于Python 3.12实现:
1. 基础方案:RGB空间欧几里得距离匹配
通过计算目标RGB值与各ANSI基础颜色在三维空间中的直线距离,选择距离最小的颜色,这是最直接的颜色匹配逻辑。
代码实现
import math # 定义基础ANSI前景色的RGB值与对应代码 ANSI_COLORS = { 'red': (255, 0, 0, '\033[31m'), 'green': (0, 255, 0, '\033[32m'), 'blue': (0, 0, 255, '\033[34m'), 'yellow': (255, 255, 0, '\033[33m'), 'cyan': (0, 255, 255, '\033[36m'), 'magenta': (255, 0, 255, '\033[35m'), 'reset': (0, 0, 0, '\033[0m') } def get_closest_ansi_color(pixel_rgb): r, g, b = pixel_rgb min_distance = float('inf') closest_code = ANSI_COLORS['reset'][3] for _, (cr, cg, cb, code) in ANSI_COLORS.items(): if code == ANSI_COLORS['reset'][3]: continue # 计算欧几里得距离 distance = math.sqrt((r - cr)**2 + (g - cg)**2 + (b - cb)**2) if distance < min_distance: min_distance = distance closest_code = code return closest_code
2. 优化方案:带感知权重的颜色匹配
人眼对不同颜色的敏感度不同:对绿色最敏感,蓝色最不敏感。可以给RGB通道加入权重(基于YUV色彩空间的亮度计算),让匹配结果更符合人眼直观感受。
代码实现
import math ANSI_COLORS = { 'red': (255, 0, 0, '\033[31m'), 'green': (0, 255, 0, '\033[32m'), 'blue': (0, 0, 255, '\033[34m'), 'yellow': (255, 255, 0, '\033[33m'), 'cyan': (0, 255, 255, '\033[36m'), 'magenta': (255, 0, 255, '\033[35m'), 'reset': (0, 0, 0, '\033[0m') } def get_closest_ansi_color_weighted(pixel_rgb): r, g, b = pixel_rgb min_distance = float('inf') closest_code = ANSI_COLORS['reset'][3] # 人眼感知权重:红0.299,绿0.587,蓝0.114 weights = (0.299, 0.587, 0.114) for _, (cr, cg, cb, code) in ANSI_COLORS.items(): if code == ANSI_COLORS['reset'][3]: continue dr, dg, db = r - cr, g - cg, b - cb # 带权重的欧几里得距离 distance = math.sqrt((dr**2)*weights[0] + (dg**2)*weights[1] + (db**2)*weights[2]) if distance < min_distance: min_distance = distance closest_code = code return closest_code
使用示例
# 测试一个像素RGB值 test_pixel = (150, 220, 60) color_code = get_closest_ansi_color_weighted(test_pixel) # 打印带颜色的方块 print(f"{color_code}■\033[0m")
内容的提问来源于stack exchange,提问作者A Random Programmer
相关产品推荐
相关产品推荐

