【发布时间】:2013-10-14 20:45:21
【问题描述】:
我有一个灰度图像,我想通过使用调色板(如 Matlab 中的颜色图)映射灰度值来以彩色显示。
我设法通过使用 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/黑色)。看看他们是否合适。对齐似乎是正确的,但我对角落周围的强烈对比有点困惑。 -
我发现了我的错误...事实上它是 RGB 但这不是问题,我的颜色值是 256 而不是 255...真的很抱歉...我想问这个问题帮我找到了答案。
-
啊……好吧。这就解释了强烈的对比(由于溢出等)。 :)
-
没有 iplImage 是 openCV 的一部分,但它现在已被 CV::Mat 取代。
-
那么请关闭问题。人们花时间解决它。