python颜色识别demo

一般对颜色空间的图像进行有效处理都是在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)

输出结果为

别的颜色经测试也可以正常识别。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值