加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

灰度图转伪彩色图和彩虹图,基于OpenCV 2.4.3

(2012-12-28 14:21:45)
标签:

it

做东西需要用到灰度转伪彩显示,毕竟嘛,人眼对彩色的分辨远远高于对灰度的分辨。

本来想这么成熟的东西网上肯定有代码,我勒个擦,找了一圈都是不知所云的东西,还是自己写一个吧!!!!

废话不说了,代码是码农的语言,就像原理图是电工的语言一样,直接上吧:


这是原始图像:

http://s6/mw690/8924265b4d1e3b21d39b5&6902.4.3" TITLE="灰度图转伪彩色图和彩虹图,基于OpenCV 2.4.3" />

这是伪彩化后的图像:

http://s12/mw690/8924265b4d1e3b761ddcb&6902.4.3" TITLE="灰度图转伪彩色图和彩虹图,基于OpenCV 2.4.3" />

代码如下:

http://s12/mw690/8924265b4d1e3b543ba9b&6902.4.3" TITLE="灰度图转伪彩色图和彩虹图,基于OpenCV 2.4.3" />

文字版的代码如下:

void CMy20121227灰度转伪彩显示Dlg::OnBnClickedButton1()
{
// TODO: Add your control notification handler code here
Mat img = imread("huidu.jpg", CV_LOAD_IMAGE_GRAYSCALE);

namedWindow("img");
imshow("img", img);
waitKey(0);

Mat img_color(img.rows, img.cols, CV_8UC3);//RGB图像

int tmp=0;
for (int y=0;y
{
for (int x=0;x
{
tmp = img.at(y,x);

img_color.at(y,x)[0] = abs(255-tmp); //blue
img_color.at(y,x)[1] = abs(127-tmp); //green
img_color.at(y,x)[2] = abs( 0-tmp); //red
}
}

namedWindow("img_color");
imshow("img_color", img_color);
waitKey(0);

destroyAllWindows();
}

 

 

但是,这种转换只是直接简单的用RGB三色交叉而已,生成的伪彩图效果并不好,那么我就考虑用MATLAB中那样生成彩虹图,区分更明显,更适合肉眼观察。

主要思路是把灰度图对应的0~255的数值分别转换成彩虹色:红、橙、黄、绿、青、蓝。这里我没有使用紫色,因为实用中发现紫色的效果并不好。彩虹色对应的RGB值在下面的代码中可以看到,所以只需要分别作线性插值就可以了。

废话少说,直接上代码,简洁明快是我的一贯风格,无论编程还是做人都是,哈哈:
http://s9/mw690/8924265b4d1e3ba863728&6902.4.3" TITLE="灰度图转伪彩色图和彩虹图,基于OpenCV 2.4.3" />

代码如下:

http://s16/mw690/8924265b4d1e3bb1d83cf&6902.4.3" TITLE="灰度图转伪彩色图和彩虹图,基于OpenCV 2.4.3" />

 

文字版代码如下:

// R G B gray
//----------------------------------
// 红 255, 0, 0 255
// 橙 255, 127, 0 204
// 黄 255, 255, 0 153
// 绿 0, 255, 0 102
// 青 0, 255, 255 51
// 蓝 0, 0, 255 0
void CMy20121227灰度转伪彩显示Dlg::OnBnClickedButton2()
{
Mat img = imread("huidu.jpg", CV_LOAD_IMAGE_GRAYSCALE);

namedWindow("img");
imshow("img", img);
waitKey(0);

Mat img_color(img.rows, img.cols, CV_8UC3);//RGB图像

#define IMG_B(img,y,x) img.at(y,x)[0]
#define IMG_G(img,y,x) img.at(y,x)[1]
#define IMG_R(img,y,x) img.at(y,x)[2]

uchar tmp=0;
for (int y=0;y
{
for (int x=0;x
{
tmp = img.at(y,x);

if (tmp <= 51)
{
IMG_B(img_color,y,x) = 255;
IMG_G(img_color,y,x) = tmp*5;
IMG_R(img_color,y,x) = 0;
}
else if (tmp <= 102)
{
tmp-=51;

IMG_B(img_color,y,x) = 255-tmp*5;
IMG_G(img_color,y,x) = 255;
IMG_R(img_color,y,x) = 0;
}
else if (tmp <= 153)
{
tmp-=102;

IMG_B(img_color,y,x) = 0;
IMG_G(img_color,y,x) = 255;
IMG_R(img_color,y,x) = tmp*5;
}
else if (tmp <= 204)
{
tmp-=153;

IMG_B(img_color,y,x) = 0;
IMG_G(img_color,y,x) = 255-uchar(128.0*tmp/51.0+0.5);
IMG_R(img_color,y,x) = 255;
}
else
{
tmp-=204;

IMG_B(img_color,y,x) = 0;
IMG_G(img_color,y,x) = 127-uchar(127.0*tmp/51.0+0.5);
IMG_R(img_color,y,x) = 255;
}
}
}

namedWindow("img_color");
imshow("img_color", img_color);
waitKey(0);

destroyAllWindows();
}


 

可以看出,这种方法转化的效果不错,能够较好的把灰度图转换成适合肉眼观察的彩虹图。

本文的编程环境是Visual Studio 2008、OpenCV 2.4.3。

 

sume

2012.12.28

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有