opencv提取RGB分量及分量区域


网上很多提取颜色分量的博客,就是我提取出来的为啥不一样,然后用了其他方法得到了一样效果的图,就是白色很尴尬。


#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;
}
opencv提取RGB分量及分量区域_第1张图片

为什么这个分量是这样的。

提取分量区域有个问题,白色好像上面蛮尴尬的。就+一个if把白色范围的点都置黑就行了。

opencv提取RGB分量及分量区域_第2张图片

你可能感兴趣的:(opencv提取RGB分量及分量区域)