网上很多提取颜色分量的博客,就是我提取出来的为啥不一样,然后用了其他方法得到了一样效果的图,就是白色很尴尬。
#include "stdafx.h"
#include
#include
using namespace cv;
using namespace std;
void GetRedComponet(Mat srcImg)
{
//如果直接对srcImg处理会改变main()函数中的实参
Mat dstImg = srcImg.clone();
Mat_::iterator it = dstImg.begin();
Mat_::iterator itend = dstImg.end();
for (; it != itend; it++)
{
if ((*it)[2] > 150)//对红色分量做阈值处理
{
(*it)[0] = 0;
(*it)[1] = 0;
(*it)[2] = 255;//红色分量保持不变
}
else
{
(*it)[0] = 0;
(*it)[1] = 0;
(*it)[2] = 0;
}
}
imshow("红色分量图 by 阈值法", dstImg);
waitKey(1);
}
// 将整幅图中的红色分量都提取出来
void GetRedComponetBySplit(Mat srcImg)
{
Mat imgROI;
vectorchannels;
split(srcImg, channels);
Mat blueComponet = channels.at(0);
Mat greenComponet = channels.at(1);
blueComponet = Mat::zeros(srcImg.size(), CV_8UC1);//Mat相当于指针,会对chnnels.at(0)重新赋值
greenComponet = Mat::zeros(srcImg.size(), CV_8UC1);
merge(channels, imgROI);//仅仅保留红色分量,其他分量赋值为0
imshow("红色分量图 by split()函数", imgROI);
waitKey(0);
}
int main() {
IplImage *car_plate = cvLoadImage("rgb.jpg", 1);
IplImage *dst_grey = cvCreateImage(cvGetSize(car_plate), IPL_DEPTH_8U, 1);
IplImage *dst_binary = cvCreateImage(cvGetSize(car_plate), IPL_DEPTH_8U, 1);
IplImage *dst_canny = cvCreateImage(cvGetSize(car_plate), IPL_DEPTH_8U, 1);
IplImage *dst_red = cvCreateImage(cvGetSize(car_plate), IPL_DEPTH_8U, 1);
IplImage *dst_green = cvCreateImage(cvGetSize(car_plate), IPL_DEPTH_8U, 1);
IplImage *dst_blue = cvCreateImage(cvGetSize(car_plate), IPL_DEPTH_8U, 1);
cvSplit(car_plate, dst_blue, dst_green, dst_red, NULL);
IplImage *RedImage = cvCreateImage(cvGetSize(car_plate), IPL_DEPTH_8U, 3);
IplImage *GreenImage = cvCreateImage(cvGetSize(car_plate), IPL_DEPTH_8U, 3);
IplImage *BlueImage = cvCreateImage(cvGetSize(car_plate), IPL_DEPTH_8U, 3);
cvMerge(0, 0, dst_red, 0, RedImage);
cvMerge(0, dst_green, 0, 0, GreenImage);
cvMerge(dst_blue, 0, 0, 0, BlueImage);
cvShowImage("rImg", RedImage);
cvShowImage("gImg", GreenImage);
cvShowImage("bImg", BlueImage);
GetRedComponet(car_plate);
GetRedComponetBySplit(car_plate);
cvWaitKey(0);
return 0;
}
为什么这个分量是这样的。
提取分量区域有个问题,白色好像上面蛮尴尬的。就+一个if把白色范围的点都置黑就行了。