匿名用户
1级
2017-05-16 回答
OpenCV 生成 伪彩色图像
opencv中没有易用的伪彩色图像生成函数,这里提供一个改造过的函数,利用自定义colorbar 将灰度图像转换成为伪彩色图像,优点在于提供了对于颜色的直观可操控性,转换方便。
函数代码如下:
[cpp] view plain copy 在CODE上查看代码片派生到我的代码片
//function : Pseudo color - enhanced
//author : Xin Yang, Shenzhen Univ., School of medicine
//email : xinyang@szu.edu.cn
//date : 2015.01.23
void C_Assistant::Gray2PseudoColor(IplImage* src ,IplImage *&dst)
{
if(dst != NULL)
{
cvReleaseImage(&dst);
dst = NULL;
}
dst = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 3);
IplImage *R, *G,*B;
//Load referred color bar
std::string HeatMapPath = "..\\ColorBar.png";
IplImage* heatmap = cvLoadImage(HeatMapPath.c_str());
//we split the heatmap along the 3 channels
R = cvCreateImage(cvGetSize(heatmap), heatmap->depth,1);
G = cvCloneImage(R);
B = cvCloneImage(R);
cvSplit(heatmap,B,G,R,NULL);
for(int x=0; xwidth; x++)
{
for(int y=0;yheight; y++)
{
//memory access to the destination color image (faster than splitting the 3 channels...)
unsigned char *data = &((unsigned char*)(dst->imageData + dst->widthStep*y ))[x*3];
//read the intensity value in the grayscale image
unsigned char gray = src->imageData[src->widthStep*y + x*src->nChannels];
//remember, OpenCV store images as BGR internally !
//So access [2] for Red, [1] for Green et [3] for Blue
float ColorIndex = gray/255.0*heatmap->height;
if(ColorIndex >= heatmap->height) ColorIndex = heatmap->height - 1;
data[2] = cvGet2D(R, ColorIndex, 1).val[0]; //Red channel
data[1] = cvGet2D(G, ColorIndex, 1).val[0]; //Green channel
data[0] = cvGet2D(B, ColorIndex, 1).val[0]; //Blue channel
}
}
//Clear
if(heatmap != NULL)
{
cvReleaseImage(&heatmap);
heatmap = NULL;
}
}
参考可用的colorbar如下,也可以自己生成来替换。