我有一张灰度图像,想通过将灰度值与颜色调色板映射(类似于Matlab中的colormap)来显示彩色图像。我使用了OpenCV的cvSet2D函数实现了这个目标,但出于性能考虑,我想直接访问像素。但是当我这样做时,图片会出现奇怪的颜色。我试过以不同的顺序设置颜色(RGB、BGR等),但好像无法解决问题。以下是我的代码:
IplImage* temp = cvCreateImage( cvSize(img->width/scale,img->height/scale), IPL_DEPTH_8U, 3 );
for (int y=0; y<temp->height; y++)
{
uchar* ptr1 = (uchar*) ( temp->imageData + y * temp->widthStep );
uchar* ptr2 = (uchar*) ( img->imageData + y * img->widthStep );
for (int x=0; x<temp->width; x++)
{
CvScalar v1;
int intensity = (int)ptr2[x];
int b=0, g=0, r=0;
r = colormap[intensity][0];
g = colormap[intensity][1];
b = colormap[intensity][2];
if (true)
{
ptr1[3*x] = b;
ptr1[3*x+1] = g;
ptr1[3*x+2] = r;
}
else
{
v1.val[0] = r;
v1.val[1] = g;
v1.val[2] = b;
cvSet2D(temp, y, x, v1);
}
}
}
将if (true)更改为if (false),可实现不同的像素访问。
使用cvSet2D可以得到正确的结果:
使用直接内存访问会得到错误的结果:
感谢您的帮助。
imageData
内的正确字节顺序应该是 BGR。如果您更改字节顺序,图像会如何变化?它应该会改变,否则您就做错了什么。尝试只渲染一种颜色(将其他通道设为0/黑色)。然后查看它们是否适合。对齐似乎是正确的,但我有些困惑角落处的硬对比度问题。 - Mario