9多通道颜色分离
多通道的色彩分离
每一张图片都是有BGR(blue,green,red)的三个值组成。如果仅有一个值,那就成了灰度图。
本例就是就一张图片的三种颜色进行分离。
步骤:
1.加载图片。cvLoadImage("1.jpg",1); 此处为相对路径(要将图片放入程序的根目录),建议使用绝对路径。
2.从原图多通道中分离出来的单通道,还是属于一张图片。所以要为每一个通道分配好内存来存储图片。
IplImage *bPhoto=cvCreateImage(cvGetSize(imgPhoto),IPL_DEPTH_8U,1);
最后一个参数 1 代表单通道。
注意:cvLoadImage("1.jpg",1); 加载的时候已经分配好内存。而新定义IplImage *bPhoto只是一个空指针,没有内存空间。
3.每一张图片都是用无数个像素点组合,而每一像素点都有三个值(B,G,R),我们要做的就是将这个值分别提取出来,赋给其他不同图像保存。
for(int j=0;j<imgPhoto->height;++j)
{
unsigned char *uszRow=(unsigned char *)(imgPhoto->imageData+imgPhoto->widthStep*j);
unsigned char *uszgRow=(unsigned char *)(gPhoto->imageData+gPhoto->widthStep*j);
for(int i=0;i<imgPhoto->width;++i)
{
uszbRow[i]=uszRow[3*i+0];
uszgRow[i]=uszRow[3*i+1];
uszrRow[i]=uszRow[3*i+2];
}
通过两个for循环,对图片的全部像素点进行遍历。第一个for横向,第二个for纵向。
uszbRow[i]=uszRow[3*i+0];
uszgRow[i]=uszRow[3*i+1];
uszrRow[i]=uszRow[3*i+2];
就是某一像素点的三个值,分别提取,赋给不同图像。
4.显示新图像
cvShowImage("imgPhoto",imgPhoto);
源代码: // Struct.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "stdio.h" #include "opencv2/core/core.hpp" #include "opencv2/highgui/highgui.hpp" #include <Windows.h> using namespace cv; int _tmain(int argc, _TCHAR* argv[]) { IplImage *imgPhoto=cvLoadImage("1.jpg",1); IplImage *bPhoto=cvCreateImage(cvGetSize(imgPhoto),IPL_DEPTH_8U,1); IplImage *gPhoto=cvCreateImage(cvGetSize(imgPhoto),IPL_DEPTH_8U,1); IplImage *rPhoto=cvCreateImage(cvGetSize(imgPhoto),IPL_DEPTH_8U,1); for(int j=0;j<imgPhoto->height;++j) { Unsig nedchar *uszRow=(unsigned char *)(imgPhoto->imageData+imgPhoto->widthStep*j); unsigned char *uszbRow=(unsigned char *)(bPhoto->imageData+bPhoto->widthStep*j); unsigned char *uszgRow=(unsigned char *)(gPhoto->imageData+gPhoto->widthStep*j); unsigned char *uszrRow=(unsigned char *)(rPhoto->imageData+rPhoto->widthStep*j); for(int i=0;i<imgPhoto->width;++i) { uszbRow[i]=uszRow[3*i+0]; uszgRow[i]=uszRow[3*i+1]; uszrRow[i]=uszRow[3*i+2]; } cvShowImage("imgPhoto",imgPhoto); cvShowImage("imgbPhoto",bPhoto); cvShowImage("imggPhoto",gPhoto); cvShowImage("imgrPhoto",rPhoto); cvWaitKey(0); system("pause"); return 0; }