使用OpenCV将RGB图像分为红色,绿色和蓝色分量
这个小型的OpenCV程序演示了如何将RGB图像分为R,G和B分量。该程序是用低级编程编写的,因为OpenCV中有内置功能,可以使此代码更高效。但是,此示例加深了对如何将图像拆分为像素矩阵以及如何分别操纵每个像素的理解。
写代码
#include
#include "cv.h"
#include "highgui.h"
using namespace std;
int main( int argc, char** argv )
{
//load color img specified by first argument
//IplImage *img = cvLoadImage( argv[1]);
IplImage *img = cvLoadImage
(argv[1], CV_LOAD_IMAGE_COLOR );
IplImage *red = cvCreateImage
(cvSize(img->width, img->height ),
img->depth, img->nChannels );
IplImage *green = cvCreateImage
(cvSize(img->width, img->height ),
img->depth, img->nChannels );
IplImage *blue = cvCreateImage
(cvSize(img->width, img->height ),
img->depth, img->nChannels );
// setup the pointer to access img data
uchar *pImg = ( uchar* )img->imageData;
// setup pointer to write data
uchar *pRed = ( uchar* )red->imageData;
uchar *pGreen = ( uchar* )green->imageData;
uchar *pBlue = ( uchar* )blue->imageData;
int i, j, rED, gREEN, bLUE, byte;
for( i = 0 ; i < img->height ; i++ )
{
for( j = 0 ; j < img->width ; j++ )
{
rED = pImg[i*img->widthStep + j*img->nChannels + 2];
gREEN = pImg[i*img->widthStep + j*img->nChannels + 1];
bLUE = pImg[i*img->widthStep + j*img->nChannels + 0];
// RED
pRed[i*img->widthStep + j*img->nChannels + 2] = rED;
// GREEN
pGreen[i*img->widthStep + j*img->nChannels + 1] = gREEN;
// BLUE
pBlue[i*img->widthStep + j*img->nChannels + 0] = bLUE;
}
}
// save images
cvSaveImage( argv[2], red );
cvSaveImage( argv[3], green );
cvSaveImage( argv[4], blue );
return 0;
}
编译
g++ `pkg-config opencv --cflags --libs` \
separate-RGB.cpp -o separate-RGB
用法
./separate-RGB img.png red.png green.png blue.png