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

opencv——操作图像中每一个像素

2016-07-21 19:32 260 查看
以下均针对opencv1.0

第一种方法:使用cvGet2D及cvSet2D

对于单通道图像:

IplImage* img = cvCreateImage(cvSize(640, 480), IPL_DEPTH_8U, 1);
for (int i = 0; i < img->height; i++)//height对应图像的行
{
for (int j = 0; j < img->width; j++)//width对应图像的列
{
CvScalar s;
//s = cvGet2D(img, i, j);// get the (i,j) pixel value
s.val[0] = 255;
cvSet2D(img, i, j, s);// set the (i,j) pixel value
}
}


对于多通道图像:

IplImage* img = cvCreateImage(cvSize(640, 480), IPL_DEPTH_32F, 3);
for (int i = 0; i < img->height; i++)//height对应图像的行
{
for (int j = 0; j < img->width; j++)//width对应图像的列
{
CvScalar s;
//s = cvGet2D(img, i, j);// get the (i,j) pixel value
s.val[0] = 0;//B
s.val[1] = 100;//G
s.val[2] = 50;//R
cvSet2D(img, i, j, s);// set the (i,j) pixel value
}
}


第二种方法:直接访问

对于单通道图像:

IplImage* img = cvCreateImage(cvSize(640, 480), IPL_DEPTH_8U, 1);
for (int i = 0; i < img->height; i++)//height对应图像的行
{
for (int j = 0; j < img->width; j++)//width对应图像的列
{
((uchar*)(img->imageData + i*img->widthStep))[j] = 255;//img->imagedata是指向图像数据第一个像素的指针,widthStep是指每一行的像素所占的字节数
}
}


对于多通道图像:

多通道字节型:

IplImage* img = cvCreateImage(cvSize(640, 480), IPL_DEPTH_8U, 3);
for (int i = 0; i < img->height; i++)//height对应图像的行
{
for (int j = 0; j < img->width; j++)//width对应图像的列
{
((uchar*)(img->imageData + i*img->widthStep))[j*img->nChannels + 0] = 0;//img->imagedata是指向图像数据第一个像素的指针,widthStep是指每一行的像素所占的字节数
((uchar*)(img->imageData + i*img->widthStep))[j*img->nChannels + 1] = 100;
((uchar*)(img->imageData + i*img->widthStep))[j*img->nChannels + 2] = 50;
}
}


多通道浮点型:

IplImage* img = cvCreateImage(cvSize(640, 480), IPL_DEPTH_32F, 3);
for (int i = 0; i < img->height; i++)//height对应图像的行
{
for (int j = 0; j < img->width; j++)//width对应图像的列
{
((float*)(img->imageData + i*img->widthStep))[j*img->nChannels + 0] = 0;//img->imagedata是指向图像数据第一个像素的指针,widthStep是指每一行的像素所占的字节数
((float*)(img->imageData + i*img->widthStep))[j*img->nChannels + 1] = 100;
((float*)(img->imageData + i*img->widthStep))[j*img->nChannels + 2] = 50;
}
}


第三种方法:指针访问

对于单通道图像:

IplImage* img = cvCreateImage(cvSize(640, 480), IPL_DEPTH_8U, 1);
for (int i = 0; i < img->height; i++)//height对应图像的行
{
for (int j = 0; j < img->width; j++)//width对应图像的列
{
int step = img->widthStep / sizeof(uchar);
uchar*data = (uchar *)img->imageData;
data[i*step + j] = 255;
}
}


对于多通道字节型图像:

IplImage* img = cvCreateImage(cvSize(640, 480), IPL_DEPTH_8U, 3);
for (int i = 0; i < img->height; i++)//height对应图像的行
{
for (int j = 0; j < img->width; j++)//width对应图像的列
{
for (int k = 0; k < img->nChannels; k++)//width对应图像的列
{
int step = img->widthStep / sizeof(uchar);
int channels = img->nChannels;
uchar*data = (uchar *)img->imageData;
data[i*step + j*channels+k] = 255;
}
}
}


对于多通道浮点型:

IplImage* img = cvCreateImage(cvSize(640, 480), IPL_DEPTH_32F, 3);
for (int i = 0; i < img->height; i++)//height对应图像的行
{
for (int j = 0; j < img->width; j++)//width对应图像的列
{
for (int k = 0; k < img->nChannels; k++)//width对应图像的列
{
int step = img->widthStep / sizeof(float);
int channels = img->nChannels;
float*data = (float *)img->imageData;
data[i*step + j*channels+k] = 255;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: