opencv RGB三通道分离
如果我们想分离出每个通道的具体值,并且可以演示看出分离的是“红”“绿”“蓝”的效果。可以用如下函数:
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,Yint 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 stringint 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/Rfor (int i = 0;i<3;i++){cv::split(srcImage,vecImage);// B/G/Rfor (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 RGB三通道分离相关推荐
- OpenCV——RGB三通道分离
opencv 和 matlab 在处理彩色图像的时候,通道的存储顺序是不同的. matlab 的排列顺序是R,G,B: 而在opencv中,排列顺序是B,G,R. 下面通过一个小程序看看opencv中 ...
- 【Opencv入门】RGB三通道直方图的计算与绘制
文章目录 一. 直方图概述 Overview of histogram 二.直方图的建立 Establishment of histogram 三.直方图的作用 The function of his ...
- 彩色图像RGB三通道问题探究
之前做图像问题研究时经常会提到RGB通道,这次做一个小研究,对最底层的东西深究一二-- 直接上全部代码吧,一点点来: # -*- coding: utf-8 -*- import cv2 img=cv ...
- BMP位图转为RGB三通道图
文章目录 读取BMP位图转为RGB三通道图 注意 相关/参考链接 本人机器开发环境 用到的图像 大小端模式介绍: 完整代码: 结果 读取BMP位图转为RGB三通道图 个人总结,目的是给自己日后参考,或 ...
- PIL将png的RGBA四通道改为jpg的RGB三通道方法
将一张png图像使用PIL读入的时候,发现是一个四通道图像,即:RGBA,分别代表Red(红色)Green(绿色)Blue(蓝色)和Alpha的色彩空间.其中Alpha通道一般用做透明度参数,这就是为 ...
- 提取图片RGB三通道数据+用RGB恢复原始图片
提取图片的RGB三通道数据+用RGB恢复原始图片 提取图片的RGB三通道数据 用RGB恢复原始图片 功能实现: 提取出一张图片的R.G.B三个通道的值并且将其分别转换为十进制数据存储到R.txt.G. ...
- tensorflow RGB三通道图转换为灰度图
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/Blue_Ghost_/article/details/81977987 </div>&l ...
- 带alpha通道四通道的图片转成rgb三通道
查看第四通道数值范围,若最大值为255,则归一化到1,再与前三通道相乘,得到叠加透明度的结果
- 将三张灰度图转换为RGB三通道图片python
import cv2 import numpy as np from PIL import Image import matplotlib.pyplot as plt #使用cv2读取图片 img = ...
最新文章
- 邬贺铨院士:十问边缘计算!
- mysql 查询rowno_C# Mysql 查询 Rownum的解决方法
- python读取excel部分值存入另一个excel-python3读取excel文件只提取某些行某些列的值方法...
- python语音播报-用Python写一个语音播放软件
- 推荐13个CSS3快速开发工具
- C#学习笔记(一)变量 常量 基本数据类型 其它
- 按要求罗列所有字符串字符序列
- vue单向数据流与双向绑定两者区别
- linux常用指令笔记(1)
- LeetCode每日一题 416. 分割等和子集
- python不同版本共存_多个python版本共存时的pip配置
- Samba 3.0.25 颁布发表
- 大数据之-入门_大数据部门业务流程分析---大数据之hadoop工作笔记0006
- Python对命令提示符cmd以及操作系统的一些操作
- 昼猫笔记 JavaScript -- 闭包
- 22.案例实战:把springboot的接口,自动生成接口文档
- 韩昊 20190919-2 功能测试
- 【python数据分析】分组聚合操作
- html标签img是什么意思,html中img标签属性是什么意思
- python中数组常用的统计方法