蓝色在RGB 有个范围,比如我用的是 “B = 118, G = 63, R = 23; //各通道的阈值设定,针对与蓝色车牌”
然后将每个像素点与BGR阈值做差,在一定范围内,则显示为白色,其他为黑色,最后自己查找一下轮廓,就可以找出感兴趣的颜色区域
#include <iostream> #include <opencv2\opencv.hpp> using namespace std; using namespace cv; int main(int, char *argv[]) { Mat OriginalImg; OriginalImg = imread("1.jpg", IMREAD_COLOR);//读取原始彩色图像 if (OriginalImg.empty()) //判断图像对否读取成功 { cout << "错误!读取图像失败\n"; return -1; } // imshow("原图", OriginalImg); //显示原始图像 cout << "Width:" << OriginalImg.rows << "\tHeight:" << OriginalImg.cols << endl;//打印长宽 //Mat ResizeImg; //if (OriginalImg.cols > 640) //{ // resize(OriginalImg, ResizeImg, Size(640, 640 * OriginalImg.rows / OriginalImg.cols)); //} //imshow("尺寸变换图", ResizeImg); unsigned char pixelB, pixelG, pixelR; //记录各通道值 unsigned char DifMax = 50; //基于颜色区分的阈值设置 // unsigned char B = 138, G = 63, R = 23; //各通道的阈值设定,针对与蓝色车牌 unsigned char B = 118, G = 63, R = 23; //各通道的阈值设定,针对与蓝色车牌 Mat BinRGBImg = OriginalImg.clone(); //二值化之后的图像 int i = 0, j = 0; for (i = 0; i < OriginalImg.rows; i++) //通过颜色分量将图片进行二值化处理 { for (j = 0; j < OriginalImg.cols; j++) { pixelB = OriginalImg.at<Vec3b>(i, j)[0]; //获取图片各个通道的值 pixelG = OriginalImg.at<Vec3b>(i, j)[1]; pixelR = OriginalImg.at<Vec3b>(i, j)[2]; if (abs(pixelB - B) < DifMax && abs(pixelG - G) < DifMax && abs(pixelR - R) < DifMax) { //将各个通道的值和各个通道阈值进行比较 BinRGBImg.at<Vec3b>(i, j)[0] = 255; //符合颜色阈值范围内的设置成白色 BinRGBImg.at<Vec3b>(i, j)[1] = 255; BinRGBImg.at<Vec3b>(i, j)[2] = 255; } else { BinRGBImg.at<Vec3b>(i, j)[0] = 0; //不符合颜色阈值范围内的设置为黑色 BinRGBImg.at<Vec3b>(i, j)[1] = 0; BinRGBImg.at<Vec3b>(i, j)[2] = 0; } } } imshow("基于颜色信息二值化", BinRGBImg); //显示二值化处理之后的图像 waitKey(); return 0; }