如果有两个Mat 图像,一个是灰度图grayimg另一个是彩色图, 常用如下的指针方法快速历遍;
for( int i = 0; i < grayim.rows; ++i)
{
//获取第 i 行首像素指针
uchar * p = grayim.ptr<uchar>(i);
//对第 i 行的每个像素(byte)操作
for( int j = 0; j < grayim.cols; ++j )
p[j] = (i+j)%255;
}
//遍历所有像素,并设置像素值
for( int i = 0; i < colorim.rows; ++i)
{
//获取第 i 行首像素指针
Vec3b * p = colorim.ptr<Vec3b>(i);
for( int j = 0; j < colorim.cols; ++j )
{
p[j][0] = i%255; //Blue
p[j][1] = j%255; //Green
p[j][2] = 0; //Red
}
但是如果他们都是用resize函数重新修改过大小的,上述的方法就不能正常使用了,.at也不能正确的提取像素值,需要如下方法历遍:
int step0 = corlorim.step[0];
int step1 = corlorim.step[1];
int esize1 = corlorim.elemSize1();
int step2 = grayim.step[0];
int step3 = grayim.step[1];
uchar *pgrayim = grayim.data;
uchar *pcorlorim=colorim.data;
for( int i = 0; i < colorim.cols; ++i)
{
for( int j = 0; j < colorim.rows; ++j)
{
pcorlorim[j*step0 + i*step1] = 255; //blue
pcorlorim[j*step0 + i*step1+esize1] = 155;//green
pcorlorim[j*step0 + i*step1 + esize1*2] = 55;//red
}
}
for( int i = 0; i < grayim.cols; ++i)
{
for( int j = 0; j < grayim.rows; ++j)
{
pgrayim[j*step2 + i*step3] = 255;
}
}
我针对的是CV_8UC1和CV_8UC3类型的,其他类型的图片需要修改指针类型。