CV图像转换
2016-05-30 22:46
337 查看
需要自己写颜色空间转换的小程序,其中涉及到LOG运算及atan运算,所以在运算过程中用到double类型数据,但最后许转换为IPL_DEPTH_8U类型,故申请了一幅图像IplImage*
hue64f = cvCreateImage( cvGetSize(src),IPL_DEPTH_64F, 1 );来存储中间变量。但是问题也随之而来。
问题1:按照公式计算完,然后再应用ConvertScale转换数据类型,但转换结果都是0;
然后从头开始查找错误
问题二:数据中存在1.#IND,1.#INF类似数据;
原因:1)像素值为0计算LOG值为负无穷;2)在计算除法时注意判断分母是否为0,如果接近于0也会出现这种情况,所以主要原因就是运算非法,这是在写程序时常常忽略的地方。
问题三:计算中间变量为DOUBLE的数据存为hue64f的像素点,再次访问不是原来得到的数据;
原因:之前访问数据元素都是IPL_DEPTH_8U类型的,而自己习惯采用指针访问,访问为
int step=src->widthStep;
uchar *srcdata=(uchar*)src->imageData;
循环访问:srcdata[i*step+j*3]。
但是在double型数据访问的时候要注意为以下方式,自己就是忽略了这些东西,使自己读到的像素值总不对。
int hue64fstep=hue64f->widthStep/sizeof(double);
double *hue64fdata=(double*)hue64f->imageData;
问题四:由64F转换到8U,线性映射过程中需要注意范围。
解决方法找到的有两种:用两个函数1)cvNormalize(hue64f,hue64f,1,0,CV_MINMAX);
//hue64f为64F位深,将其归一化到0-1之间
//src的值为0-1,乘以scale也就是255,则dst的值变为0-255,符合要求
cvConvertScale(hue64f,hue8u,255,0);
2)double minVal;
double maxVal;
cvMinMaxLoc(hue64f, &minVal, &maxVal);
printf("%f ",minVal);
printf("%f",maxVal);
// Normalize image (0 - 255) to be observed as an u8 image
double scale = 255/(maxVal - minVal);
double shift = -minVal * scale;
cvConvertScale(hue64f,hue8u,scale,shift);
关于浮点数运算出错链接:http://zhidao.baidu.com/question/235292334.html
浮点图像转为8u图像有用的链接:
http://www.opencv.org.cn/forum/viewtopic.php?f=1&t=17773&p=57896&hilit=cvMinMaxLoc#p57896
http://hi.baidu.com/25wensanmu/blog/item/37d8359031ee4897a877a486.html
http://hi.baidu.com/s100400541/blog/item/78d5380d4f56ea336a60fb7f.html
hue64f = cvCreateImage( cvGetSize(src),IPL_DEPTH_64F, 1 );来存储中间变量。但是问题也随之而来。
问题1:按照公式计算完,然后再应用ConvertScale转换数据类型,但转换结果都是0;
然后从头开始查找错误
问题二:数据中存在1.#IND,1.#INF类似数据;
原因:1)像素值为0计算LOG值为负无穷;2)在计算除法时注意判断分母是否为0,如果接近于0也会出现这种情况,所以主要原因就是运算非法,这是在写程序时常常忽略的地方。
问题三:计算中间变量为DOUBLE的数据存为hue64f的像素点,再次访问不是原来得到的数据;
原因:之前访问数据元素都是IPL_DEPTH_8U类型的,而自己习惯采用指针访问,访问为
int step=src->widthStep;
uchar *srcdata=(uchar*)src->imageData;
循环访问:srcdata[i*step+j*3]。
但是在double型数据访问的时候要注意为以下方式,自己就是忽略了这些东西,使自己读到的像素值总不对。
int hue64fstep=hue64f->widthStep/sizeof(double);
double *hue64fdata=(double*)hue64f->imageData;
问题四:由64F转换到8U,线性映射过程中需要注意范围。
解决方法找到的有两种:用两个函数1)cvNormalize(hue64f,hue64f,1,0,CV_MINMAX);
//hue64f为64F位深,将其归一化到0-1之间
//src的值为0-1,乘以scale也就是255,则dst的值变为0-255,符合要求
cvConvertScale(hue64f,hue8u,255,0);
2)double minVal;
double maxVal;
cvMinMaxLoc(hue64f, &minVal, &maxVal);
printf("%f ",minVal);
printf("%f",maxVal);
// Normalize image (0 - 255) to be observed as an u8 image
double scale = 255/(maxVal - minVal);
double shift = -minVal * scale;
cvConvertScale(hue64f,hue8u,scale,shift);
关于浮点数运算出错链接:http://zhidao.baidu.com/question/235292334.html
浮点图像转为8u图像有用的链接:
http://www.opencv.org.cn/forum/viewtopic.php?f=1&t=17773&p=57896&hilit=cvMinMaxLoc#p57896
http://hi.baidu.com/25wensanmu/blog/item/37d8359031ee4897a877a486.html
http://hi.baidu.com/s100400541/blog/item/78d5380d4f56ea336a60fb7f.html
相关文章推荐
- Mootools 1.2教程 函数
- autoit InputBox 函数
- 文件遍历排序函数
- 关于C#中排序函数的总结
- Oracle 函数大全[字符串函数,数学函数,日期函数]第1/4页
- ASP下经常用的字符串等函数参考资料
- PostgreSQL教程(五):函数和操作符详解(1)
- DOS批处理 函数定义与用法
- asp Chr 函数 数字转字母的方法
- Lua中的函数精讲笔记
- Lua中的闭合函数、非全局函数与函数的尾调用详解
- Lua中调用C++函数示例
- Lua实现split函数
- Lua常用时间函数使用实例
- Lua函数与字符串处理简明总结
- Lua学习笔记之表和函数
- Lua中实现sleep函数功能的4种方法
- Lua函数用法研究
- Lua基础教程之赋值语句、表达式、流程控制、函数学习笔记
- Sql Server中REPLACE函数的使用