opencv-python车牌颜色判断

本文介绍了一种通过HSV颜色空间阈值来识别车牌颜色的Python方法。针对蓝色、黄色和绿色车牌,定义了HSV阈值范围,然后将图像转换为HSV空间并创建掩膜。通过对掩膜中白色像素点的计数,确定哪种颜色的车牌占比最高,从而识别车牌颜色。虽然该方法有效,但存在遍历像素点导致效率低下的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在截取出车牌区域之后,我们需要判断车牌是什么颜色。
我的思路是:根据不同颜色的hsv阈值取掩膜,掩膜得到的白色像素值最大的就是对应的颜色。

取hsv颜色的阈值参考我之前的博客:Opencv+python打开摄像头或对图片拖动滑动条取颜色阈值
主要区分3种颜色的车牌:蓝色、黄色和绿色
得到的阈值如下:

lower_blue = np.array([100, 43, 46])
upper_blue = np.array([124, 255, 255])
lower_yellow = np.array([15, 55, 55])
upper_yellow = np.array([50, 255, 255])
lower_green = np.array([0, 3, 116])
upper_green = np.array([76, 211, 255])

代码如下:

import cv2
import numpy as np

# img_path = cv2.imread('./rest/yellow.png')
# img_path = cv2.imread('./rest/blue.jpg')
img_path = cv2.imread('./rest/green.jpg')
cv2.imshow('origin', img_path)

height = img_path.shape[0]
width = img_path.shape[1]
print('面积:', height * width)


# 设定阈值
lower_blue = np.array([100, 43, 46])
upper_blue = np.array([124, 255, 255])
lower_yellow = np.array([15, 55, 55])
upper_yellow = np.array([50, 255, 255])
lower_green = np.array([0, 3, 116])
upper_green = np.array([76, 211, 255])

# 转换为HSV
hsv = cv2.cvtColor(img_path, cv2.COLOR_BGR2HSV)

# 根据阈值构建掩膜
mask_blue = cv2.inRange(hsv, lower_blue, upper_blue)
mask_yellow = cv2.inRange(hsv, lower_yellow, upper_yellow)  #
mask_green = cv2.inRange(hsv, lower_green, upper_green)  #

# 对原图像和掩膜进行位运算
# src1:第一个图像(合并的第一个对象)src2:第二个图像(合并的第二个对象)mask:理解为要合并的规则。
res_blue = cv2.bitwise_and(img_path, img_path, mask=mask_blue)
res_yellow = cv2.bitwise_and(img_path, img_path, mask=mask_yellow)
res_green = cv2.bitwise_and(img_path, img_path, mask=mask_green)

# 显示图像
# cv2.imshow('frame', img_path)
cv2.imshow('mask_blue', mask_blue)
cv2.imshow('mask_yellow', mask_yellow)
cv2.imshow('mask_green', mask_green)
# cv2.imshow('res', res)

# 对mask进行操作--黑白像素点统计  因为不同颜色的掩膜面积不一样
# 记录黑白像素总和

blue_white = 0
blue_black = 0
yellow_white = 0
yellow_black = 0
green_white = 0
green_black = 0

# 计算每一列的黑白像素总和
for i in range(width):
    for j in range(height):
        if mask_blue[j][i] == 255:
            blue_white += 1
        if mask_blue[j][i] == 0:
            blue_black += 1
        if mask_yellow[j][i] == 255:
            yellow_white += 1
        if mask_yellow[j][i] == 0:
            yellow_black += 1
        if mask_green[j][i] == 255:
            green_white += 1
        if mask_green[j][i] == 0:
            green_black += 1

print('蓝色--白色 = ', blue_white)  
print('蓝色--黑色 = ', blue_black) 
print('黄色--白色 = ', yellow_white)  
print('黄色--黑色 = ', yellow_black)  
print('绿色--白色 = ', green_white)
print('绿色--黑色 = ', green_black) 

color_list = ['蓝色','黄色','绿色']
num_list = [blue_white,yellow_white,green_white]

print('车牌的颜色为:',color_list[num_list.index(max(num_list))])

cv2.waitKey(0)

测试1:
在这里插入图片描述

在这里插入图片描述
测试2:
在这里插入图片描述
在这里插入图片描述
测试3:
在这里插入图片描述
在这里插入图片描述
可以看到,这种方法基本能比较好地区分颜色,但缺点是需要遍历每个像素点,而且3种颜色就遍历3次,这是比较低效的,目前暂时没想其他的方法,就先余着吧。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值