一. 所需结构体
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(); //防止打印速度太快,暂停一次打印一次
}
}
运行结果: