如何从颜色字典匹配图片最相似颜色?代码调试求助
图片颜色识别程序的问题修正
代码中的核心问题
重复读取图片且参数错误
第一行img = cv2.imread('purple.jpg', cv2.COLOR_BGR2HSV)是错误用法,cv2.imread的第二个参数是读取模式(如cv2.IMREAD_COLOR),不是颜色转换标识。这行属于无效代码,直接删除即可。错误使用BGR图像做HSV范围匹配
你已经将图片转换成HSV格式的hsv变量,但cv2.inRange却用了原始BGR格式的img——你的color_list定义的是HSV空间的范围,必须用hsv作为第一个参数传入,否则匹配逻辑完全失效。HSV颜色范围定义错误
现有color_list里的颜色范围不符合OpenCV的HSV标准(H:0-179,S:0-255,V:0-255):- 红色:OpenCV中红色分为H=0-10和H=170-179两段,且需要合理的饱和度、亮度阈值,你当前的红色范围S值为0,只能匹配灰度区域。
- 白色/黑色:限制了S值为0,实际白色应是低饱和度(S<30)+高亮度,黑色应是低亮度(V<50),无需限制饱和度。
mask.sum调用错误mask.sum是numpy求和方法的引用,不是计算结果,必须写成mask.sum()才能获取匹配像素的总和。缺少“找相似度最高颜色”的逻辑
原代码仅输出有匹配的颜色,未统计哪个颜色匹配像素最多,无法实现“找相似度最高”的需求。
修正后的完整代码
import cv2 import numpy as np # 符合OpenCV标准的HSV颜色范围 color_list = { "white": ([0, 0, 200], [179, 30, 255]), "black": ([0, 0, 0], [179, 255, 50]), "red_low": ([0, 40, 40], [10, 255, 255]), "red_high": ([170, 40, 40], [179, 255, 255]), "green": ([40, 40, 40], [70, 255, 255]), "yellow": ([20, 40, 40], [40, 255, 255]), "blue": ([90, 40, 40], [130, 255, 255]) } # 读取图片并转换为HSV格式 img = cv2.imread('purple.jpg') if img is None: print("无法读取图片,请检查路径是否正确") exit() hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) max_match_pixels = 0 best_match_color = "未知" red_total = 0 # 遍历颜色范围统计匹配像素数 for color_name, (lower, upper) in color_list.items(): lower = np.array(lower, dtype=np.uint8) upper = np.array(upper, dtype=np.uint8) # 使用HSV图像做范围匹配 mask = cv2.inRange(hsv, lower, upper) # 每个匹配像素值为255,除以255得到实际像素数量 match_count = mask.sum() // 255 # 合并红色两段的匹配数 if color_name.startswith("red"): red_total += match_count else: if match_count > max_match_pixels: max_match_pixels = match_count best_match_color = color_name # 单独比较红色的总匹配数 if red_total > max_match_pixels: max_match_pixels = red_total best_match_color = "red" print(f"与图片颜色相似度最高的预设颜色是:{best_match_color},匹配像素数:{max_match_pixels}")
内容的提问来源于stack exchange,提问作者Nighttwinkle
相关产品推荐
相关产品推荐

