精华内容
下载资源
问答
  • 这个是基于VC6.0+opencv1.0平台的,用于将一副图像的RGB三通道分离显示,大家第一眼看上去可能会感觉代码比较乱,你直接复制粘贴到你的编程界面就可以使用了
  • opencv RGB三通道分离

    千次阅读 2016-11-26 16:30:43
    如果我们想分离出每个通道的具体值,并且可以演示看出分离的是“红”“绿”“蓝”的效果。可以用如下函数: 1、C接口程序: IplImage* img = cvLoadImage("baboon.jpg"); IplImage* rImg=cvCreateImage...


    如果我们想分离出每个通道的具体值,并且可以演示看出分离的是“红”“绿”“蓝”的效果。可以用如下函数:

    1、C接口程序:

    	IplImage* img = cvLoadImage("baboon.jpg");
    	IplImage* rImg=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);    
    	IplImage* gImg=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);    
    	IplImage* bImg=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1); 
    	cvSplit( img,bImg, gImg,rImg,0);  
    	IplImage* rImg3=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,3);    
    	IplImage* gImg3=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,3);    
    	IplImage* bImg3=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,3);   
    	cvMerge(bImg,gImg,0,0,rImg3);  
    	cvMerge(bImg,0,rImg,0,gImg3);  
    	cvMerge(0,gImg,rImg,0,bImg3); 

    cvMerge源程序:

    CV_IMPL void cvMerge(const void* srcarr0, const void* srcarr1, const void* srcarr2,
             const void* srcarr3, void* dstarr )
    {
        const void* sptrs[] = { srcarr0, srcarr1,srcarr2, srcarr3 };
        cv::Mat dst = cv::cvarrToMat(dstarr);
        int i, j, nz = 0;
        for( i = 0; i < 4; i++ )
            nz += sptrs[i] != 0;
        CV_Assert( nz > 0 );
        cv::vector<cv::Mat> svec(nz);
        cv::vector<int> pairs(nz*2);
     
        for( i = j = 0; i < 4; i++ )
        {
            if( sptrs[i] != 0 )
            {
                svec[j] = cv::cvarrToMat(sptrs[i]);
                CV_Assert( svec[j].size == dst.size&&
                    svec[j].depth() == dst.depth()&&
                    svec[j].channels() == 1&& i < dst.channels() );
                pairs[j*2] = j;
                pairs[j*2+1] = i;
                j++;
            }
        }
        if( nz == dst.channels() )
            cv::merge( svec, dst );
        else
        {
            cv::mixChannels( &svec[0], nz,&dst, 1, &pairs[0], nz );
        }
    }
    

    说明:cvMerge函数中cv::Mat dst = cv::cvarrToMat(dstarr);这句会使得dst中元素全为205,具体为什么不清楚。

    2、C++接口程序

    //单窗口显示多幅图像
    int showManyImages( const std::vector<cv::Mat> &srcImages, cv::Size imgSize,cv::Mat& dstImage )
    {
    	int nNumImages = srcImages.size();
    	cv::Size nSizeWindows;
    	if(nNumImages > 12)
    	{
    		std::cout << " Not more than 12 images!" << std::endl;
    		return -1;
    	}
    	// 根据图片序列数量来确定分割小窗口形态
    	switch(nNumImages)
    	{
    	case 1: nSizeWindows = cv::Size(1,1);break;
    	case 2: nSizeWindows = cv::Size(2,1);break;
    	case 3: 
    	case 4: nSizeWindows = cv::Size(2,2);break;
    	case 5: 
    	case 6: nSizeWindows = cv::Size(3,2);break;
    	case 7: 
    	case 8: nSizeWindows = cv::Size(4,2);break;
    	case 9: nSizeWindows = cv::Size(3,3);break;
    	default:nSizeWindows = cv::Size(4,3);break;
    	}
    	// 设置小图像尺寸,间隙,边界
    	cv::Size nShowImageSize = cv::Size(300,200);//每张图显示在画布上的尺寸
    	int nSplitLineSize  = 30;
    	int nAroundLineSize = 50;
    	// 创建输出图像,图像大小根据输入源确定
    	const int imagesHeight = nShowImageSize.height * nSizeWindows.height+ 
    		nAroundLineSize + (nSizeWindows.width - 1) *
    		nSplitLineSize;
    	const int imagesWidth = nShowImageSize.width*nSizeWindows.height + 
    		nAroundLineSize + (nSizeWindows.height - 1) * 
    		nSplitLineSize;
    	//std::cout << imagesWidth << " " << imagesHeight << std::endl;
    	cv::Mat resultImage(imagesHeight, imagesWidth, 
    		CV_8UC3,cv::Scalar(0,0,0));
    	// 提取对应小图像的左上角坐标X,Y
    	int posX = (resultImage.cols-(nShowImageSize.width*
    		nSizeWindows.width+(nSizeWindows.width-1)*
    		nSplitLineSize))/2;
    	int posY = (resultImage.rows-(nShowImageSize.height*
    		nSizeWindows.height+(nSizeWindows.height-1)*
    		nSplitLineSize))/2;
    	//std::cout << posX << " " << posY  << std::endl;
    	int tempPosX = posX;
    	int tempPosY = posY;
    
    	//write text on image	
    	std::vector<cv::string> msg;
    	msg.push_back("original image");
    	msg.push_back("blue image");
    	msg.push_back("green image");
    	msg.push_back("red image");
    	int baseLine = 0;
    
    	// 将每一小幅图像整合大图像
    	for(int i = 0; i < nNumImages; i++)
    	{
    		// 小图像坐标转换
    		if(( i % nSizeWindows.width == 0) && ( tempPosX != posX ))
    		{
    			tempPosX = posX;
    			tempPosY  += (nSplitLineSize + nShowImageSize.height);
    		}
    		// 利用Rect区域将小图像置于大图像相应区域
    		cv::Mat tempImage = resultImage(cv::Rect(tempPosX, 
    			tempPosY , nShowImageSize.width, nShowImageSize.height));
    		// 利用resize函数实现图像缩放
    		resize(srcImages[i], tempImage,
    			cv::Size( nShowImageSize.width ,   nShowImageSize.height));
    
    		cv::Size textSize = cv::getTextSize(msg[i], 1, 1, 1, &baseLine);//returns bounding box of the text string
    		int textPosX = tempPosX + nShowImageSize.width/2 - textSize.width/2;
    		int textPosY = tempPosY - 10;
    		cv::Point textOrigin(textPosX,textPosY);
    		cv::putText(resultImage,msg[i],textOrigin,1,1,cv::Scalar(255,255,255),1,8);
    
    		tempPosX += (nSplitLineSize + nShowImageSize.width);	
    	}
    	dstImage = resultImage.clone();
    }
    int main()
    {
    	cv::Mat srcImage = cv::imread("baboon.jpg"); 
    	if(!srcImage.data) return -1;
    	std::vector<cv::Mat> vecImage(3),bgrImage(3);
    	cv::split(srcImage,vecImage);// B/G/R
    	for (int i = 0;i<3;i++)
    	{
    		cv::split(srcImage,vecImage);// B/G/R
    		for (int j = 0;j<3;j++)
    		{
    			if (i != j )  
    				vecImage[i] = cv::Mat::ones(srcImage.size(), vecImage[0].type())*205;//为了保持与cvMerge结果一致  
    		}
    		cv::merge(vecImage,bgrImage[i]); 
    	}
    	cv::Mat showImage;
        	bgrImage.insert(bgrImage.begin(),srcImage);
    	showManyImages(bgrImage,cv::Size(2,2),showImage);
    	cv::imwrite("showImage.jpg",showImage);
    	cv::waitKey(0);
    	return 0;
    }


    结果:






    展开全文
  • opencv 和 matlab 在处理彩色图像的时候。通道的存储顺序是不同的。...以下通过一个小程序看看opencv中的通道。 //PS_Algorithm.h #ifndef PS_ALGORITHM_H_INCLUDED #define PS_ALGORITHM_H_INCLUD...

    opencv 和 matlab 在处理彩色图像的时候。通道的存储顺序是不同的。

    matlab 的排列顺序是R,G,B; 而在opencv中,排列顺序是B,G,R。

     

    以下通过一个小程序看看opencv中的三个通道。


    // PS_Algorithm.h

    #ifndef PS_ALGORITHM_H_INCLUDED
    #define PS_ALGORITHM_H_INCLUDED

    #include <iostream>
    #include <string>
    #include "cv.h"
    #include "highgui.h"
    #include "cxmat.hpp"
    #include "cxcore.hpp"

    using namespace std;
    using namespace cv;

    #endif // PS_ALGORITHM_H_INCLUDED


    // Public_Function.h

    #ifndef PUBLIC_FUNCTION_H_INCLUDED
    #define PUBLIC_FUNCTION_H_INCLUDED

    #include <iostream>
    #include <string>
    #include "cv.h"
    #include "highgui.h"
    #include "cxmat.hpp"
    #include "cxcore.hpp"

    using namespace std;
    using namespace cv;

    void Show_Image(Mat&, const string &);
    void Save_Image(Mat&, const string &);

    #endif // PUBLIC_FUNCTION_H_INCLUDED


    /*
    The program will Divides multi-channel array
    into several single-channel arrays.
    We can get the single-channel from a multi-channel
    image.
    */

    #include "PS_Algorithm.h"
    #include "Public_Function.h"
    using namespace std;
    using namespace cv;

    int main()
    {
        string Img_name("4.jpg");
        Mat Image_in;
        Image_in=imread(Img_name);
        Show_Image(Image_in, Img_name);


        // convert the type of the image.
        // from the uchar to the float.
        Mat Image_2(Image_in.size(), CV_32FC3);
        Image_in.convertTo( Image_2, CV_32FC3);

        Mat r(Image_in.rows, Image_in.cols, CV_32FC1);
        Mat g(Image_in.rows, Image_in.cols, CV_32FC1);
        Mat b(Image_in.rows, Image_in.cols, CV_32FC1);


        Mat out[]={b,g,r};
        split(Image_2, out);

        // 三个通道的顺序是 b,g,r.
        b=out[0]/255;
        g=out[1]/255;
        r=out[2]/255;

        Show_Image(g, "g");
     
        waitKey();
    }


    原图



    R 通道



    G 通道



    B 通道


    转载于:https://www.cnblogs.com/jhcelue/p/6852821.html

    展开全文
  • opencv分离RGB三通道

    2016-10-20 21:26:36
    使用opencv对彩色图像进行RGB三通道分离
  • MatLab:彩色图像RGB三通道分离与合并

    万次阅读 多人点赞 2020-02-26 20:38:32
    1 RGB三通道分离成三个单通道 %%RGB_split.m image = imread('C:\Users\王千一\Desktop\1.bmp'); %%显示原图片 %%imshow(image) %%R通道 R = image(:,:,1); %%imshow(R) imwrite(R,'C:\Users\王千一\Desktop\R....

    MatLab:RGB三通道的分离与合并

    1 RGB三通道分离成三个单通道

    %%RGB_split.m
    
    image = imread('C:\Users\王千一\Desktop\1.bmp');
    
    %%显示原图片
    %%imshow(image)
    
    %%R通道
    R = image(:,:,1);
    %%imshow(R)
    imwrite(R,'C:\Users\王千一\Desktop\R.bmp');
    
    %%G通道
    G = image(:,:,2);
    %%imshow(G)
    imwrite(G,'C:\Users\王千一\Desktop\G.bmp');
    
    %%B通道
    B = image(:,:,3);
    %%imshow(B)
    imwrite(B,'C:\Users\王千一\Desktop\B.bmp');
    

    1.bmp文件:
    // 由于1.bmp文件大于5M网站上传不上去,故这里用jpg图片代替
    1.bmp
    R.bmp文件:
    R.bmp
    G.bmp文件:
    G.bmp
    B.bmp文件:
    B.bmp

    我这里是用bmp文件,用jpg文件也可以

    2 RGB三个单通道的灰色图像合并为彩色图像

    %%RGB_merge.m
    
    R=imread('C:\Users\王千一\Desktop\R.bmp');
    G=imread('C:\Users\王千一\Desktop\G.bmp');
    B=imread('C:\Users\王千一\Desktop\B.bmp');
    
    RGB(:,:,1)=R(:,:,1);
    RGB(:,:,2)=G(:,:,1);
    RGB(:,:,3)=B(:,:,1);
    
    imwrite(RGB,'C:\Users\王千一\Desktop\2.bmp');
    

    将“1”中的RGB三个分量合成一个彩色图片
    2.bmp文件:
    // 和1.bmp一样,2.bmp文件大于5M网站上传不上去,故这里用jpg图片代替)2.bmp

    展开全文
  • 数字图像处理课程中的作业,关于图片中RGB三通道分离与合并,用matlab实现; 将一幅彩色图像分别用RGB三个分量单独表示成三张图片; 再将这三张图片合并成一张彩色图片;
  • RGB图像通道分离

    千次阅读 2020-03-21 01:33:11
    每一张彩色图片都可以由RGB3个通道组成,R指的是red红色,G指的是green绿色,B指的是blue蓝色。因此,可以将彩色图分离张图片,一张是红色,一张是绿色,一张是蓝色。 2,代码实现 import numpy as np ...

    1,前言

    每一张彩色图片都可以由RGB3个通道组成,R指的是red红色,G指的是green绿色,B指的是blue蓝色。因此,可以将彩色图分离成三张图片,一张是红色,一张是绿色,一张是蓝色。

    2,代码实现

    import numpy as np
    import matplotlib.pyplot as plt
    import cv2
    img_name = "cat.jpg"
    img_array = cv2.imread(img_name)
    h,w,c = img_array.shape
    R_img_array = np.zeros((h,w,3),dtype=np.uint8) #初始化Red图片,全部值为0
    G_img_array = np.zeros((h,w,3),dtype=np.uint8) #初始化Green图片,全部值为0
    B_img_array = np.zeros((h,w,3),dtype=np.uint8) #初始化Blue 图片,全部值为0
    
    R_img_array[:,:,0] = img_array[:,:,0] 
    G_img_array[:,:,1] = img_array[:,:,1]
    B_img_array[:,:,2] = img_array[:,:,2]
    
    
    plt.subplot(2,2,1)
    plt.imshow(img_array)
    
    plt.subplot(2,2,2)
    plt.imshow(R_img_array)
    
    plt.subplot(2,2,3)
    plt.imshow(G_img_array)
    
    plt.subplot(2,2,4)
    plt.imshow(B_img_array)
    plt.show()
    
    
    # 可以把刚刚的图片保存下来
    cv2.imwrite("cat_R.jpg",R_img_array)
    cv2.imwrite("cat_G.jpg",G_img_array)
    cv2.imwrite("cat_B.jpg",B_img_array)

    3,效果显示

    原图:

     结果图:

     

    展开全文
  • 原始的RGB文件,将其通道的数据通过photoshop可以简单且完整分离出来。
  • RGB通道分离

    千次阅读 2017-12-12 13:59:34
    img=imread('d:\1.bmp'); R=img(:,:,1);%可以单独处理 G=img(:,:,2); B=img(:,:,3); imshow(img);%合并RGB显示
  • 2、从一副彩色图像中分离出R、G、B通道(cvSplit),并且显示 3. 分别对每个通道图像创建直方图,并显示 首先介绍一下opencv中的cvSplit函数: 函数原型: [cpp] view ...
  • RGB三通道图像和灰度值简单理解

    万次阅读 多人点赞 2019-04-21 20:18:52
    24bit RGB图像也叫全彩图。其有三个通道,分别为:R(red),G(green),B(blue)。 用halcon程序以及halcon自带图像进行理解RGB图像和灰度值。 1.读一张图像(橘子在蓝色背景下)...2.三通道分离,并获取灰度值 decomp...
  • 【opencv】RGB图像通道分离和合并

    千次阅读 2014-11-16 20:49:47
    //彩色3通道 Mat src(sharpenedLena.rows,sharpenedLena.cols,CV_8UC3);    //用来存储目的图片的矩阵  Mat res(sharpenedLena.rows,sharpenedLena.cols,CV_8UC3);    Mat r(sharpenedLena.rows,...
  • 做两个边缘检测算子:拉普拉斯和Robert算子,主要用于分离通道,出3个灰度化图像,
  • 将图片由RGB三通道转换为单通道

    万次阅读 2019-05-13 18:21:50
    将一个RGB的图片转换为单通道就是将R,G,B单独的分离出来,之前想过将图片直接灰度化,但灰度化并不是单通道要用到 split()代码如下: import matplotlib.pyplot as plt # plt 用于显示图片 from PIL import ...
  • RGB图像四维卷积运算方法一:分离通道,二维卷积 (大矩阵效率低) 方法一:分离通道,二维卷积 (大矩阵效率低) 对图像进行padding,保证有效数据宽高和缩放后图像的宽高一致(卷积核中心点对应于实际坐标点) ...
  • OpenCV+python 图像RGB通道分离

    千次阅读 2020-05-26 17:04:14
    img1) cv2.waitKey(0) cv2.destroyAllWindows() 由于OpenCV中的通道为B G R ,所以0代表B通道,以此类推,代码中设B和R通道为0,那么图像就是绿色了。实验效果: 赵敏小姐姐,哈哈。 来张红色的: import cv2 import...
  • 由于算法的需要,需要把彩色图像的R、G、B值分离出来,OpenCV中正好有split() 和 ...一、对单独彩色图片的RGB通道分离: #include #include "cv.h" #include "highgui.h" using namespace std; using namespace cv;
  • RGB 图像颜色通道分离和合并图像复制图像颜色通道分离后显示灰度图图像颜色通道分离后显示彩色 图像复制 图像复制 #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> using ...
  • Opencv中RGB通道/HSV通道分离

    千次阅读 2018-01-31 23:00:00
    OpenCV中HSV颜色模型及颜色分量范围 opencv HSV 颜色模型(H通道取值 &... 将原图分离RGB单通道和B三通道(GR通道均为0) 1 Mat src_color = imread(path); 2 vector<Mat> ch...
  • 使用OpenCV分离RGB颜色通道

    千次阅读 2014-03-06 12:17:32
    最近在使用OpenCV写毕业...OpenCV分离RGB颜色通道。示例图:分离出来的效果图如下:程序源代码:#include "cv.h"' #include "cxcore.h" #include "highgui.h" #include using namespace std; int main () { IplImage*

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,871
精华内容 3,148
关键字:

rgb三通道分离