使用Opencv获取每个像素点的RGB颜色分量/HSV颜色分量

一.  所需结构体

CvScalar

结构体介绍

typedef struct CvScalar  
{  
  double val[4];  //BGRA
  }CvScalar;  

所需函数

cvGet2D

函数功能:获取像素点上的RGB颜色分量,如果是灰度图直接返回灰度图颜色分量

函数原型:

CvScalar cvGet2D( const CvArr* arr, int idx0, int idx1 );

参数介绍

const CvArr* arr:    要获取像素点颜色分量的图像指针
int idx0:            对应第几行
int idx1:            对应第几列

返回值:将获取到的像素点值以BGR的顺序返回到CvScalar结构体的val元素中,如果是灰度图那么val第一个元素就是灰度图的颜色分量

 

三. 开始编写代码

实验图:

jpg格式

3.1 打开一张图片

//加载图像到内存
IplImage *image = cvLoadImage("D:\\1.jpg");
if (image == NULL){	//open image error
	printf("打开图像文件失败!");
	return -1;
}

获取像素点颜色RGB颜色分量

CvScalar scalar;	//scalar
	for (int i = 0; i <= image->height-1; ++i){
		for (int j = 0; j <= image->width-1; ++j){
			scalar = cvGet2D(image,i,j);	//获取像素点的RGB颜色分量
			printf("第%d个像素的R:%lf,B:%lf,G:%lf\n",(i*image->width)+j, scalar.val[2], scalar.val[0], scalar.val[1]);
			getchar();	//防止打印速度太快,暂停一次打印一次
		}
	}

运行结果:

完整代码:

	//加载图像到内存
	IplImage *image = cvLoadImage("D:\\1.jpg");
	if (image == NULL){	//open image error
		printf("打开图像文件失败!");
		return -1;
	}
	CvScalar scalar;	//scalar
	for (int i = 0; i <= image->height-1; ++i){
		for (int j = 0; j <= image->width-1; ++j){
			scalar = cvGet2D(image,i,j);	//获取像素点的RGB颜色分量
			printf("第%d个像素的R:%lf,B:%lf,G:%lf\n",(i*image->width)+j, scalar.val[2], scalar.val[0], scalar.val[1]);
			getchar();	//防止打印速度太快,暂停一次打印一次
		}
	}

HSV通道:

需要cvCvtColor函数,我们只需要复用一下上面的代码即可

注意HSV颜色空间没有顺序问题,而RGB颜色空间Opencv使用的是BGR!

//加载图像到内存
	IplImage *image = cvLoadImage("D:\\1.jpg");
	if (image == NULL){	//open image error
		printf("打开图像文件失败!");
		return -1;
	}
	IplImage *image1 = cvCreateImage(cvSize(image->width, image->height), image->depth, image->nChannels);  //注意图像必须和输入图像的size,颜色位深度,通道一致
	cvZero(image1); //清空image_data数据  
	cvCvtColor(image, image1, CV_BGR2HSV);//CV_BGR2HSV  
	CvScalar scalar;	//scalar
	for (int i = 0; i <= image1->height-1; ++i){	//HSV
		for (int j = 0; j <= image1->width-1; ++j){
			scalar = cvGet2D(image1, i, j);	//获取像素点的RGB颜色分量
			printf("第%d个像素的H:%d°,S:%lf,V:%lf\n", (i*image->width) + j, (int)scalar.val[0]*2, scalar.val[1]/255, scalar.val[2]/255);
			getchar();	//防止打印速度太快,暂停一次打印一次
		}
	}

运行结果:

 

 

 

 

 

 

 

 

 

 

 

 

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值