关于汽车颜色识别

本文介绍了一个基于HSV颜色空间的小程序,该程序能够识别并判断输入图片中的汽车颜色属于九种常见颜色中的哪一种。通过将RGB图像转换为HSV颜色模型,并利用预设的颜色范围阈值进行像素级比对,最终输出最有可能的颜色类别。

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

#1,首先说说我自己做的一个小程序

有参考优快云中的一篇博客,具体文章链接找不到了。

主要思想:将RGB颜色空间中的图像转换到HSV空间,根据常见九种颜色的H、S、V范围来判断给定图像中的汽车最大概率属于哪种色系的车。

常见颜色的HSV范围:(也是参考的网上的为主)

程序接口:【输入】Mat类型,汽车图片的patch;【输出】string类型,上面九种颜色中的一种;

算法流程图:

 

#2,存在的问题

可能原因:我个人觉得,HSV空间中的值与实际肉眼中的颜色并不是线性的映射关系,所以单纯用一个线性范围来给出一中颜色的HSV值是有问题的,实验结果也验证了我这个猜想。很多车子在进去检测时都会有误,如下给出几种:

尽管代码有问题,但还是在此贴出,以备之后改进:

/***********************************
-----------------------------------

Name:  sophia
Date:  20161206
Email: hxinwen1218@sina.com

-----------------------------------
Function: Reco
Identification the color of the cars.

************************************/

#include<iostream>
#include<vector>
#include<string>
#include<conio.h>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>

using namespace std;
using namespace cv;


string ImgClass(Mat image);

/*
number	color
0		blue;
1		orange;
2		yellow;
3		green;
4		violet
5		red;
6		white;
7		grey;
8		black;
9		red;
*/

int main(){
	while (1)
	{ 
		string img_name;
		cout << "Please enter the name of the image: " << endl;
		cin >> img_name;
		string imgN = img_name + ".jpg";
		Mat img = imread(imgN);
		string className;

		className=ImgClass(img);

		cout << "The class of the car is: " << className << endl;


		char ch;
		ch = _getch();
		if (ch == 27)
			break;
		else
			continue;
	}

	system("Pause");
	return 0;
}

string ImgClass(Mat image){
	int classNum = 10;
	int lowH, highH, lowS, highS, lowV, highV;
	vector<double> ptRate(classNum, 0.0);
	string outClass;

	for (int ic = 0; ic < classNum; ic++)
	{
		switch (ic)
		{
		case 0://blue
			lowH = 100;
			highH = 124;
			lowS = 63;
			highS = 255;
			lowV = 76;
			highV = 220;
			break;
		case 1://orange
			lowH = 11;
			highH = 25;
			lowS = 43;
			highS = 255;
			lowV = 46;
			highV = 255;
			break;
		case 2://yellow
			lowH = 22;
			highH = 37;
			lowS = 43;
			highS = 255;
			lowV = 46;
			highV = 255;
			break;
		case 3:
			lowH = 35;
			highH = 77;
			lowS = 43;
			highS = 255;
			lowV = 46;
			highV = 255;
			break;
		case 4:
			lowH = 125;
			highH = 155;
			lowS = 43;
			highS = 255;
			lowV = 46;
			highV = 255;
			break;
		case 5:
			lowH = 0;
			highH = 10;
			lowS = 43;
			highS = 255;
			lowV = 46;
			highV = 255;
			break;
		case 6://white
			lowH = 0;
			highH = 180;
			lowS = 0;
			highS = 25;
			lowV = 225;
			highV = 255;
			break;
		case 7://grey
			lowH = 0;
			highH = 180;
			lowS = 28;
			highS = 40;
			lowV = 30;
			highV = 221;
			break;
		case 8://black
			lowH = 0;
			highH = 180;
			lowS = 0;
			highS = 255;
			lowV = 0;
			highV = 30;
			break;
		case 9://red
			lowH = 156;
			highH = 180;
			lowS = 43;
			highS = 255;
			lowV = 46;
			highV = 255;
			break;
		}

		Mat imgHSV;
		vector<Mat> hsvSplit;
		cvtColor(image, imgHSV, COLOR_BGR2HSV);

		split(imgHSV, hsvSplit);
		equalizeHist(hsvSplit[2], hsvSplit[2]);
		merge(hsvSplit, imgHSV);

		Mat imgThresholded;
		inRange(imgHSV, Scalar(lowH, lowS, lowV), Scalar(highH, highS, highV), imgThresholded);

		int nonZeroNum = 0;
		vector<Mat> channelsImg;
		split(imgThresholded, channelsImg);
		Mat_<uchar> imgResult = channelsImg[0];
		for (int ia = 0; ia < imgResult.rows; ia++)
			for (int ib = 0; ib < imgResult.cols; ib++)
				if (imgResult(ia, ib) != 0)
					nonZeroNum++;

		double rateCac = (double)nonZeroNum / (double)(imgResult.rows*imgResult.cols);
		ptRate[ic] = rateCac;
	}

	double curRate = 0.0;
	int classN;
	for (int id = 0; id < ptRate.size(); id++)
	{
		if (ptRate[id] > curRate)
		{
			curRate = ptRate[id];
			classN = id;
		}
	}
	
	switch (classN){
	case 0:
		outClass = "blue";
		break;
	case 1:
		outClass = "orange";
		break;
	case 2:
		outClass = "yellow";
		break;
	case 3:
		outClass = "green";
		break;
	case 4:
		outClass = "violet";
		break;
	case 5:
		outClass = "red";
		break;
	case 6:
		outClass = "white";
		break;
	case 7:
		outClass = "grey";
		break;
	case 8:
		outClass = "black";
		break;
	case 9:
		outClass = "red";
	}

	return outClass;
}

 

如果您有更好的想法,请多多指教!

 

### 车辆颜色识别技术的国外研究成果 车辆颜色识别作为计算机视觉领域的一个重要分支,在交通管理、自动驾驶以及安防监控等方面有着广泛应用。国外研究者们提出了多种有效的算法来提高这一过程中的准确性。 #### 基于传统机器学习的方法 早期的工作主要依赖于手工设计特征提取器配合分类模型完成任务。例如,通过色彩空间转换(如RGB到HSV),可以更好地分离色调信息从而提升区分度[^1]。此外,还有学者利用纹理分析增强对于相似色系之间的辨别能力[^2]。 #### 深度学习驱动下的进步 近年来,随着深度神经网络的发展,卷积神经网络(CNNs)被广泛应用于图像处理场景下,同样也促进了车体着色自动判别的发展。ResNet架构因其出色的性能表现成为许多方案的选择之一;同时为了适应不同光照条件的影响,一些团队尝试引入注意力机制改进基础框架结构,使得系统能够在复杂环境下保持稳定输出质量[^3]。 ```python import torch from torchvision import models, transforms from PIL import Image def predict_color(image_path): model = models.resnet50(pretrained=True) preprocess = transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]), ]) input_image = Image.open(image_path) input_tensor = preprocess(input_image) input_batch = input_tensor.unsqueeze(0) with torch.no_grad(): output = model(input_batch) probabilities = torch.nn.functional.softmax(output[0], dim=0) top_prob, top_catid = torch.topk(probabilities, 1) return top_prob.item(), top_catid.item() ``` 该代码片段展示了如何基于预训练好的 ResNet-50 进行车牌颜色预测的基础流程,实际应用中还需要针对特定数据集进行微调优化以获得更佳效果[^4]。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sophia_xw

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值