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;
}

 

posted @ 2017-09-03 21:33  gd_沐辰  阅读(328)  评论(0编辑  收藏  举报