cvScale 深度转换 线性变换

本文转载自:http://shijuanfeng.blogbus.com/logs/215967179.html

在处理一些需要图像相加运算的操作时,通常定义 
  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保存。

int main(int argc, char ** argv)
{
 
    IplImage* img = cvLoadImage("1.jpg",CV_LOAD_IMAGE_GRAYSCALE);  
 
    IplImage* tmp = cvCloneImage(img);  
 
    IplImage* dst = cvCreateImage(cvGetSize(img),IPL_DEPTH_64F,img->nChannels);  
 
    double M,m;  
    cvScale(img,dst,1.0,0.0);  
    cvAdd(dst,dst,dst);  
 
    cvMinMaxLoc(dst, &m, &M, NULL, NULL, NULL);  
    cout<<"M="<<M<<endl<<"m="<<m<<endl;  
 
    cvScale(dst,tmp,1.0,0.0);  
 
    cvScale(dst, dst, 1.0/(M-m), 1.0*(-m)/(M-m));//图像数据转换到[0,1]区间  
 
    cvMinMaxLoc(dst, &m, &M, NULL, NULL, NULL);  
    cout<<"M="<<M<<endl<<"m="<<m<<endl;  
 
    cvNamedWindow("img",CV_WINDOW_AUTOSIZE);  
    cvShowImage("img",img);  
 
    cvNamedWindow("tmp",CV_WINDOW_AUTOSIZE);  
    cvShowImage("tmp",tmp);  
 
    cvNamedWindow("dst",CV_WINDOW_AUTOSIZE);  
    cvShowImage("dst",dst);  
 
    cvWaitKey(-1);  
    cvDestroyAllWindows(); 
 
    cvReleaseImage(&img);  
    cvReleaseImage(&tmp);  
    cvReleaseImage(&dst);  
 
 
    return 0;
}
原文地址:http://shijuanfeng.blogbus.com/logs/215967179.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值