opencv访问图像像素

来源:互联网 发布:软件需求分析活动 编辑:程序博客网 时间:2024/05/21 17:48

opencv访问图像像素

访问图像像素

 

(1)假设你要访问第k通道、第i行、第j列的像素。

 

(2)间接访问:(通用,但效率低,可访问任意格式的图像)

对于单通道字节型图像:

IplImage*img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);

CvScalar s;

s=cvGet2D(img,i,j); // getthe (i,j) pixel value

printf("intensity=%f\n",s.val[0]);

s.val[0]=111;

cvSet2D(img,i,j,s); // setthe (i,j) pixel value

对于多通道字节型/浮点型图像:

IplImage*img=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3);

CvScalar s;

s=cvGet2D(img,i,j); // getthe (i,j) pixel value

printf("B=%f,G=%f,R=%f\n",s.val[0],s.val[1],s.val[2]);

s.val[0]=111;

s.val[1]=111;

s.val[2]=111;

cvSet2D(img,i,j,s); // setthe (i,j) pixel value

 

(3)直接访问:(效率高,但容易出错)

对于单通道字节型图像:

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

 

(4)基于指针的直接访问:(简单高效)

对于单通道字节型图像:

IplImage*img =cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);

intheight    =img->height;

intwidth     =img->width;

intstep      =img->widthStep/sizeof(uchar);

uchar*data   = (uchar*)img->imageData;

data[i*step+j] = 111;

对于多通道字节型图像:

IplImage*img =cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3);

intheight    =img->height;

intwidth     =img->width;

intstep      =img->widthStep/sizeof(uchar);

intchannels  =img->nChannels;

uchar*data   = (uchar*)img->imageData;

data[i*step+j*channels+k] =111;

对于多通道浮点型图像(假设图像数据采用4字节(32位)行对齐方式):

IplImage*img =cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3);

intheight    =img->height;

intwidth     =img->width;

intstep      =img->widthStep/sizeof(float);

intchannels  =img->nChannels;

float *data   = (float*)img->imageData;

data[i*step+j*channels+k] =111;

 

(5)基于c++wrapper 的直接访问: (更简单高效)

首先定义一个 c++ wrapper‘Image’,然后基于Image定义不同类型的图像:

template class Image

{

 private:

 IplImage*imgp;

 public:

 Image(IplImage*img=0) {imgp=img;}

 ~Image(){imgp=0;}

 voidoperator=(IplImage* img) {imgp=img;}

  inlineT*operator[](const int rowIndx) {

    return((T*)(imgp->imageData + rowIndx*imgp->widthStep));}

};

 

typedef struct{

  unsignedcharb,g,r;

} RgbPixel;

 

typedef struct{

  floatb,g,r;

} RgbPixelFloat;

 

typedefImage      RgbImage;

typedefImage  RgbImageFloat;

typedefImage  BwImage;

typedefImage         BwImageFloat;

对于单通道字节型图像:

IplImage*img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);

BwImage imgA(img);

imgA[i][j] = 111;

对于多通道字节型图像:

IplImage*img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3);

RgbImage imgA(img);

imgA[i][j].b = 111;

imgA[i][j].g = 111;

imgA[i][j].r = 111;

对于多通道浮点型图像:

IplImage*img=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3);

RgbImageFloat imgA(img);

imgA[i][j].b = 111;

imgA[i][j].g = 111;

imgA[i][j].r = 111;

原创粉丝点击