OpenCV提取显示一张图片的R,G,B颜色分量


使用OpenCV分别提取一张图片的R、G、B分量然后显示出来:

#include "opencv/cv.h"
#include "opencv/highgui.h"

int main(int argc,char** argv)
{
    IplImage* src = cvLoadImage(argv[1]);//载入图像
    
    //Allocate individual image planes
    IplImage* channel_r = cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1);
    IplImage*  channel_g = cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1);
    IplImage*  channel_b = cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1);
    IplImage* img_r = cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,3);
    IplImage* img_g = cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,3);
    IplImage* img_b = cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,3);
    
    cvSplit(src, channel_b, channel_g, channel_r,NULL);
    cvMerge(channel_b,0,0,0,img_b);
    cvMerge(0,channel_g,0,0,img_g);
    cvMerge(0,0,channel_r,0,img_r);
   
    cvNamedWindow("src",0);
    cvNamedWindow("Image_B",0);
    cvNamedWindow("Image_G",0);
    cvNamedWindow("Image_R",0);
    
    cvShowImage( "src", src);
    cvShowImage( "Image_B",  img_b);
    cvShowImage( "Image_G",  img_g);
    cvShowImage( "Image_R",  img_r);
   
   while(1){
        if((cvWaitKey(10)&0x7f) == 27)break;
    }
    
    cvReleaseImage(&src);
    cvReleaseImage(&channel_r);
    cvReleaseImage(&channel_g);
    cvReleaseImage(&channel_b);
    cvReleaseImage(&img_r);
    cvReleaseImage(&img_g);
    cvReleaseImage(&img_b);
      
    cvDestroyWindow("src");
    cvDestroyWindow("Image_R");
    cvDestroyWindow("Image_G");
    cvDestroyWindow("Image_B");
    
    return 0;
}


Split
分割多通道数组成几个单通道数组或者从数组中提取一个通道void cvSplit( const CvArr* src, CvArr* dst0, CvArr* dst1,CvArr* dst2, CvArr* dst3 );#define cvCvtPixToPlane cvSplit
src
原数组.
dst0...dst3
目标通道函数 cvSplit 分割多通道数组成分离的单通道数组 d。可获得两种操作模式 . 如果原数组有 N 通道且前 N 输出数组非 NULL, 所有的通道都会被从原数组中提取,如果前 N个通道只有一个通道非 NULL 函数只提取该指定通道,否则会产生一个错误,余下的通道(超过前 N 个通道的以上的)必须被设置成 NULL,对于设置了 COI 的 IplImage 结使用 cvCopy 也可以从图像中提取单通道。


CreateImage
创建头并分配数据IplImage* cvCreateImage( CvSize size, int depth, int channels );
size
图像宽、高.
depth
图像元素的位深度,可以是下面的其中之一:
IPL_DEPTH_8U - 无符号 位整型
IPL_DEPTH_8S - 有符号 位整型
IPL_DEPTH_16U - 无符号 16 位整型
IPL_DEPTH_16S - 有符号 16 位整型
IPL_DEPTH_32S - 有符号 32 位整型
IPL_DEPTH_32F - 单精度浮点数
IPL_DEPTH_64F - 双精度浮点数
channels
每个元素(像素)通道号.可以是 1, 2, 3 或 4.通道是交叉存取的,例如通常的彩色图像数据
排列是:
b0 g0 r0 b1 g1 r1 ...
虽然通常 IPL 图象格式可以存贮非交叉存取的图像,并且一些 OpenCV 也能处理他但是
这个函数只能创建交叉存取图像.函数 cvCreateImage 创建头并分配数据,这个函数是下列的缩写型式header = cvCreateImageHeader(size,depth,channels);cvCreateData(header);


Merge
从几个单通道数组组合多通道数组或插入一个单通到数组void cvMerge( const CvArr* src0, const CvArr* src1,const CvArr* src2, const CvArr* src3, CvArr* dst );#define cvCvtPlaneToPix cvMerge
src0... src3
输入的通道.
dst
输出数组.函数 cvMerge 是前一个函数的反向操作。如果输出数组有 N 个通道并且前 N 个输入通道非 NULL,就拷贝所有通道到输出数组,如果在前 N 个通道中只有一个单通道非 NULL ,只拷贝这个通道到输出数组,否则 就会产生错误。除前 N 通道以外的余下的通道必须置 NULL。对于设置了 COI 的 IplImage 结构使用 cvCopy 也可以实现向图像中插入一个通道



效果如下:




  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值