在截取出车牌区域之后,我们需要判断车牌是什么颜色。
我的思路是:根据不同颜色的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次,这是比较低效的,目前暂时没想其他的方法,就先余着吧。