opencv中获取图像像素的方法数组
方法一:指针
IplImage *img = cvLoadImage("Lena.jpg", 0);内存
CvScalar pixel;
for (int i = 0; i < img->height; ++i)
{
for (int j = 0; j < img->width; ++j)
{
//得到像素的RGB值并显示 opencv
pixel = cvGet2D(img, i, j);
printf("B=%f,G=%f,R=%f\t", pixel.val[0], pixel.val[1], pixel.val[2]);
//修改各点的值
pixel.val[0] = 0; // B份量
pixel.val[1] = 0; // G份量
pixel.val[2] = 0; // R份量
cvSet2D(img, i, j, pixel);
}
}float
注意内存中存储顺序是BGR方法
方法二:im
for (int i = 0; i < img->height; ++i)
{
for (int j = 0; j < img->width; ++j)
{数据
int b = CV_IMAGE_ELEM(paintx, uchar, y1, x1 * 3);img
int g = CV_IMAGE_ELEM(paintx, uchar, y1, x1 * 3+1);类型转换
int r= CV_IMAGE_ELEM(paintx, uchar, y1, x1 * 3+2);
}
}
方法三:
对于单通道字节型图像:
IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);
((uchar *)(img->imageData + i*img->widthStep))[j]=111;
对于多通道字节型图像:
IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3);
((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 0]=111; // B
((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 1]=112; // G
((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 2]=113; // R
对于多通道浮点型图像:
IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3);
((float *)(img->imageData + i*img->widthStep))[j*img->nChannels + 0]=111; // B
((float *)(img->imageData + i*img->widthStep))[j*img->nChannels + 1]=112; // G
((float *)(img->imageData + i*img->widthStep))[j*img->nChannels + 2]=113; // R
3 ((uchar*)(Img1->imageData + Img1->widthStep*pt.y))[pt.x]的具体含义:
(1)这里img1->imagedata指的图像第一行的首地址,pt.y是指图像的height(图像高像素数即行数),y乘以img->widthstep(排列的图像行大小)即首地址加上行数乘以每行总数,获得第y行的首地址。widthstep是指图像每行所占的字节数,主要要和width区别,width是指每行所含的像素个数,可是一个像素也可能占一个字节,也可能占三个字节或者四个。imagedata是指向存储图像像素值数组的指针,内容是这个数组的首地址,pt.y指的是像素点的行坐标,因此Img->imageData + Img->widthStep*pt.y即是该像素点所在行的首地址,而后再加上该像素点所在的列,即pt.x,就获得了该像素点的地址,因此那句代码也能够写成
((uchar*)(Img1->imageData + Img1->widthStep*pt.y+pt.x)),
都是指该像素点的像素值,至于强制类型转换,是由于会产生一些负值,而像素值是不能为负的。
(2)widthStep表示存储一行像素须要的字节数。widthStep必须是4的倍数,若是8U图像宽度为3,那么widthStep是4,加一个字节补齐。这个图像的一行须要4个字节,只使用前3个,最后一个空在那儿不用。也就是一个宽3高3的图像的imageData数据大小为4*3=12字节。若是32F的图像,那么widthStep=width*4。