原创 OpenCV对不同图像深度的处理(转)

2011-6-1 19:08 7573 4 5 分类: 处理器与DSP

 在处理一些需要图像相加运算的操作时,通常定义
    IplImage* dst = cvCreateImage(cvGetSize(img),IPL_DEPTH_64F,img->nChannels);
      当处理完成后,需要对原这个IPL_DEPTH_64F深度的图像进行显示的时候,就需要做一些转换。可以用cvScale()这个函数,这个函数主要是对图像做线性变换。如果不转换的话,可以发现显示的图像是全白的。这是由于IPL_DEPTH_64F类型的图片显示范围为[0,1]。
    cvMinMaxLoc(dst, &m, &M, NULL, NULL, NULL);
      cvScale(dst, dst, 1.0/(M-m), 1.0*(-m)/(M-m));//图像数据转换到[0,1]区间
    这个时候就可以正常的显示图像了。当需要在不同深度的图像之间转换时,也可以用cvScale()这个函数。这个时候的转换,中间有个截断处理过程。比如IPL_DEPTH_64F到IPL_DEPTH_8U,就会把300转换到255。下面转一段别人总结的深度显示范围。
    测试double型:0.0--1.0之间                           IPL_DEPTH_64F
      测试float型:0.0--1.0之间                              IPL_DEPTH_32F
      测试long型:0--65535之间                             IPL_DEPTH_32S        
      测试short int型:-32768--32767之间                  IPL_DEPTH_16S        
      测试unsigned short int型:0--65535之间              IPL_DEPTH_16U
      测试char型:-128--127之间                            IPL_DEPTH_8S          
      测试unsigned char型:0--255之间                     IPL_DEPTH_8U
      这个时候如果需要保存图像,请记住要先转换到IPL_DEPTH_8U的深度。因为只有8位单通道或者3通道(通道顺序为'BGR' )才可以使用cvSaveImage保存。下面贴一段自己测试用的代码:

     

  1. int main(int argc, char ** argv)  
  2. {  
  3.     IplImage* img = cvLoadImage("lena.bmp",CV_LOAD_IMAGE_GRAYSCALE);  
  4.     IplImage* tmp = cvCloneImage(img);  
  5.     IplImage* dst = cvCreateImage(cvGetSize(img),IPL_DEPTH_64F,img->nChannels);  
  6.     double M,m;  
  7.     cvScale(img,dst,1.0,0.0);  
  8.     cvAdd(dst,dst,dst);  
  9.     cvMinMaxLoc(dst, &m, &M, NULL, NULL, NULL);  
  10.     cout<<"M="<<M<<endl<<"m="<<m<<endl;  
  11.   
  12.     cvScale(dst,tmp,1.0,0.0);  
  13.   
  14.     cvScale(dst, dst, 1.0/(M-m), 1.0*(-m)/(M-m));//图像数据转换到[0,1]区间  
  15.   
  16.     cvMinMaxLoc(dst, &m, &M, NULL, NULL, NULL);  
  17.     cout<<"M="<<M<<endl<<"m="<<m<<endl;  
  18.   
  19.     cvNamedWindow("img",CV_WINDOW_AUTOSIZE);  
  20.     cvShowImage("img",img);  
  21.   
  22.     cvNamedWindow("tmp",CV_WINDOW_AUTOSIZE);  
  23.     cvShowImage("tmp",tmp);  
  24.   
  25.     cvNamedWindow("dst",CV_WINDOW_AUTOSIZE);  
  26.     cvShowImage("dst",dst);  
  27.       
  28.     cvWaitKey(-1);  
  29.     cvDestroyAllWindows();  
  30.     cvReleaseImage(&dst);  
  31.     return 0;  

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户377235 2013-4-30 20:29

好的
相关推荐阅读
用户345574 2011-10-12 18:53
软件开发经验浅谈
http://blog.csdn.net/xiayeliangfeng/article/details/575216不知不觉做软件已经做了两年,有成功的喜悦,也有失败的痛苦,但总不敢称自己是高手,因为...
用户345574 2011-09-18 01:34
WideCharToMultiByte 将CString转为char
BOOL CAdoRecordSet::GetChunk(long index, CBitmap &bitmap){ CString str=GetFieldName(index); int ...
用户345574 2011-09-18 01:34
WideCharToMultiByte 将CString转为char
BOOL CAdoRecordSet::GetChunk(long index, CBitmap &bitmap){ CString str=GetFieldName(index); int ...
用户345574 2011-09-06 13:46
八皇后及n皇后问题
八皇后问题http://blog.csdn.net/developinglife/article/details/6683845是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八...
用户345574 2011-09-05 13:58
螺旋队列算法分析
http://blog.csdn.net/yhmhappy2006/article/details/2934435螺旋队列的样子如下图:   两大规律:1。螺旋规律(红线)2。奇数平方规律(紫线) 问...
用户345574 2011-08-29 15:53
剖析Windows用1G内存还慢的原因
现在的内存基本达到了1元/MB的均价,不少朋友的电脑告别了可怜的64MB、128MB内存,256MB已经成为标准配制,512MB甚至1GB的内存也不再是”耸人听闻”。但是有一件事情让很多朋友疑惑:”为...
EE直播间
更多
我要评论
1
4
关闭 站长推荐上一条 /3 下一条