赞
踩
一般对颜色空间的图像进行有效处理都是在HSV空间进行的,然后对于基本色中对应的HSV分量需要给定一个严格的范围,下面是通过实验计算的模糊范围(准确的范围在网上都没有给出)。
H: 0 — 180
S: 0 — 255
V: 0 — 255
此处把部分红色归为紫色范围(颜色阈值可以尝试调整,调到最佳):
定义颜色阈值代码如下:
- # -*- coding: utf-8 -*-
- # @Time : 2021/12/28 17:07
- # @Author : ZY
- # @Site :
- # @File : colorList.py
- # @Software: PyCharm
- import numpy as np
- import collections
-
-
- # 定义字典存放颜色分量上下限
- # 例如:{颜色: [min分量, max分量]}
- # {'red': [array([160, 43, 46]), array([179, 255, 255])]}
-
- def getColorList():
- dict = collections.defaultdict(list)
-
- # 黑色
- lower_black = np.array([0, 0,0])
- upper_black = np.array([180,255,46])
- color_list = []
- color_list.append(lower_black)
- color_list.append(upper_black)
- dict['黑'] = color_list
-
- # #绿色
- lower_gray = np.array([35, 43, 46])
- upper_gray = np.array([77, 255, 255])
- color_list = []
- color_list.append(lower_gray)
- color_list.append(upper_gray)
- dict["绿"]=color_list
- # #黄
- lower_gray = np.array([26, 43, 46])
- upper_gray = np.array([34, 255, 255])
- color_list = []
- color_list.append(lower_gray)
- color_list.append(upper_gray)
- dict["黄"] = color_list
-
- # 紫色
- lower_purple = np.array([125, 43, 46])
- upper_purple = np.array([180, 255, 255])
- color_list = []
- color_list.append(lower_purple)
- color_list.append(upper_purple)
- dict['紫'] = color_list
-
- return dict
-
-
- if __name__ == '__main__':
- color_dict = getColorList()
- print(color_dict)
-
- num = len(color_dict)
- print('num=', num)
-
- for d in color_dict:
- print('key=', d)
- print('value=', color_dict[d][1])
'运行
这是一个单独的colorList.py文件,通过导入py文件调用即可
在所需要的地方定义好函数,如get_color(frame)函数,我所定义如下代码:
- import colorList #首先导入刚写好的colorList.py文件
- def get_color(frame):
- # print('go in get_color')
- hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
- maxsum = -100
- color = None
- color_dict = colorList.getColorList()
- for d in color_dict:
- mask = cv2.inRange(hsv, color_dict[d][0], color_dict[d][1])
- # cv2.imwrite(d + '.jpg', mask)
- binary = cv2.threshold(mask, 127, 255, cv2.THRESH_BINARY)[1]
- binary = cv2.dilate(binary, None, iterations=2)
- cnts, hiera = cv2.findContours(binary.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
- sum = 0
- for c in cnts:
- sum += cv2.contourArea(c)
- if sum > maxsum:
- maxsum = sum
- color = d
-
- return color
在主函数中首先读取你所识别的照片,然后调用定义,进行识别图片颜色,具体代码如下:
- photo = cv2.imread("screen.png")
- Color = get_color(photo)
- print(Color)
输出结果为
别的颜色经测试也可以正常识别。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。