您的位置:首页 > 运维架构

基于vs2010+opencv2.4.8实现----将三通道RGB图片分别按R,G,B三个不同分量输出显示

2017-03-17 17:48 537 查看
(一)RGB模型:

            RGB模型是工业界的一种颜色标准,是通过对红(Red),绿(Green),蓝(Blue)3个颜色亮度的变化以及她们相互之间的叠加来得到各种各样的颜色的。该标准几乎包括了人类视觉所能感知的所有的颜色,是目前运用最广的模型之一。

(二)理论基础:

       RGB彩色空间对应的坐标系统是如图一所示的立方体,红,绿和蓝位于立方体的三个顶点上,青,品红和黄位于另外三个定点上,黑色在原点处,而白色位于距离远点最远的顶点处,而灰度等级就沿着这两点连线分布;不同颜色处在立方体上或其内部,因此可以用三个三维向量来表示。例如,在所有颜色均已归一化至【0,1】的情况下,蓝色可以表示为【0,0,1】,而灰色可由向量【0.5,0.5,0.5】来表示。

    在RGB模型中,三个图像分量组成了所要表示的图像,而每一个分量图像都是其原色图像。



说明,RGB图像是三通道图像,在计算机中是按照B,G,R的顺序存储的,所以RGB图像上任意一点(x,y)处的地址p可以理解为是大小为3的一维数组,如p[3],其中p[0]存放B分量值,p[1]存放G分量值,p[2]存放R分量值。

(三)完整的实现程序

/*-------------------------------------------------------------------------------------------------------
*程序说明:
* 基于OpenCV实现-------将三通道RGB图片分别按R,G,B三个不同分量输出显示
*开发环境:
* win7+vs2010+opencv2.4.8
*创建时间地点:
* 陕西师范大学。2017.3.17
*参考资料:
* 无
*作者:
* 李先生
--------------------------------------------------------------------------------------------------------*/
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\imgproc\imgproc.hpp>
#include<opencv2\imgproc\imgproc_c.h>

/*-------------------------------------------------------------------------------------------------------
* 函数功能
* 将三通道RGB图片分别按R,G,B三个不同分量存储
* 函数参数
* IplImage* src; RGB图像
* IplImage* RImage; R分量的存储矩阵(图像)
* IplImage* GImage; G分量的存储矩阵
* IplImage* BImage; B分量的存储矩阵
---------------------------------------------------------------------------------------------------------*/
void RGB(IplImage* src,IplImage* RImage,IplImage* GImage,IplImage* BImage)
{
int nHeight = src->height;
int nWidth = src->width;

for(int i=0;i<nHeight;i++)
{
for(int j=0;j<nWidth;j++)
{
// 提取出像素点(j,i)处的地址,存储在一个指针变量中,因为src是三通到的图像,在计算机中RGB图像是按照B,G,R的顺序存储的
// 所以每一点的地址大小实际上就是等同于大小为三的数组 如p[3],所以按照B,G,R的存储顺序,p[0]=B,p[1]=G,p[2]=R;
uchar *p=(uchar*)(src->imageData+i*src->widthStep)+src->nChannels*j;

int B=p[0];
int G=p[1];
int R=p[2];

((uchar*)(BImage->imageData+i*BImage->widthStep)+BImage->nChannels*j)[0] = B; //一通道存放 B 分量,其他两个通道的分量值为 0
((uchar*)(BImage->imageData+i*BImage->widthStep)+BImage->nChannels*j)[1] = 0;
((uchar*)(BImage->imageData+i*BImage->widthStep)+BImage->nChannels*j)[2] = 0;

((uchar*)(GImage->imageData+i*GImage->widthStep)+GImage->nChannels*j)[0] = 0; //二通道存放 G 分量,其他两个通道的分量值为 0
((uchar*)(GImage->imageData+i*GImage->widthStep)+GImage->nChannels*j)[1] = G;
((uchar*)(GImage->imageData+i*GImage->widthStep)+GImage->nChannels*j)[2] = 0;

((uchar*)(RImage->imageData+i*RImage->widthStep)+RImage->nChannels*j)[0] = 0; //三通道存放 R 分量,其他两个通道的分量值为 0
((uchar*)(RImage->imageData+i*RImage->widthStep)+RImage->nChannels*j)[1] = 0;
((uchar*)(RImage->imageData+i*RImage->widthStep)+RImage->nChannels*j)[2] = R;

}
}
}
/*-------------------------------------------------------------------------------------------------------
* 函数功能
* 主函数,我们的程序从这里开始执行
---------------------------------------------------------------------------------------------------------*/
int main()
{
IplImage* srcImage=cvLoadImage("G:\\Image\\face2.jpg",CV_LOAD_IMAGE_COLOR); //加载图像,参数 CV_LOAD_IMAGE_COLOR 意味着不管原始图像的通道数是多少,都将被转换为3通道输入

CvSize RGBSize;
RGBSize.height = srcImage->height;
RGBSize.width = srcImage->width;

IplImage * RedImage = cvCreateImage(RGBSize,IPL_DEPTH_8U,3); //创建三个和原图像同等大小的矩阵,用来存储 R G B 三个不同分量的像素
IplImage * GreenImage = cvCreateImage(RGBSize,IPL_DEPTH_8U,3);
IplImage * BlueImage = cvCreateImage(RGBSize,IPL_DEPTH_8U,3);

RGB(srcImage,RedImage,GreenImage,BlueImage); //调用分解函数

cvNamedWindow("原图"); //创建显示图像的窗口
cvNamedWindow("R分量");
cvNamedWindow("G分量");
cvNamedWindow("B分量");

cvShowImage("原图",srcImage); //显示原图及效果图
cvShowImage("R分量",RedImage);
cvShowImage("G分量",GreenImage);
cvShowImage("B分量",BlueImage);

cvWaitKey(0);

cvDestroyWindow("原图"); //释放内存空间
cvDestroyWindow("R分量");
cvDestroyWindow("G分量");
cvDestroyWindow("B分量");
cvReleaseImage(&srcImage);
cvReleaseImage(&RedImage);
cvReleaseImage(&GreenImage);
cvReleaseImage(&BlueImage);
return 0;

}

(4)结果显示
        (1)原图

               

 

       (2)结果图

               
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐