CV图像转换

原创 2016年05月30日 22:46:25

 需要自己写颜色空间转换的小程序,其中涉及到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

版权声明:本文为博主原创文章,未经博主允许不得转载。

Mat 颜色空间转换

颜色空间转换,cvtColor函数和cvCvtColor函数
  • u012428169
  • u012428169
  • 2016年11月02日 15:21
  • 494

Halcon与OpenCV图像数据结构转换

#include "HalconCpp.h" #include #include using namespace cv; using namespace Halcon;class Exchange ...
  • qq_34316932
  • qq_34316932
  • 2016年11月21日 15:57
  • 530

cv::Mat 对像素进行操作取地址

cv::Matdepth/dims/channels/step/data/elemSizeThe class Mat represents an n-dimensional dense numeric...
  • lester_pang
  • lester_pang
  • 2017年04月18日 20:17
  • 586

cv::Mat 图像拷贝、复制的问题

Mat最直接的拷贝、复制方法是通过cv::Mat::clone()来复制,像Matlab中的拷贝方式用”=“号在这里是错误的,用"="号的结果就是内存不独立,图像Image和拷贝图像copyImage...
  • yuan13091324
  • yuan13091324
  • 2015年05月15日 13:36
  • 2808

cv::Mat两张图片的叠加方法

适用jpg图片的叠加void mergeImage(cv::Mat &img1, cv::Mat img2, int x, int y) { if(x < 0 || y < 0) ...
  • liukang325
  • liukang325
  • 2017年03月05日 10:35
  • 787

Open CV 学习笔记:访问图像中像素的几种方法

1.利用.ptr 和 []的方法 2.利用Mat_ iteractor迭代器 3.利用动态地址计算配合at 的方法 4.利用.ptr 和 * ++ 以及模操作的方法 5.利用操作符重载 ...
  • ymmqwe
  • ymmqwe
  • 2015年03月27日 19:40
  • 970

用cvCvtColor转化RGB彩色图像为灰度图像时发生的小失误

版本信息MAC版本:10.10.5 Xcode版本:7.2 openCV版本:2.4.13 在运行程序的时候发现cvCvtColor的地方程序报错error: (-215) src.depth...
  • ecjtuacm_yuewei
  • ecjtuacm_yuewei
  • 2016年07月27日 16:39
  • 668

OpenCV学习笔记_图像转换cvCvtColor、通道分割cvSplit以及通道合并cvMerge

#include #include using namespace std; int main(void){ IplImage* cur; cur = cvLoadImage("D:\\tes...
  • u013167052
  • u013167052
  • 2016年04月28日 17:14
  • 984

OpenCV笔记(cv::Mat)

复制: 如果定义为 uchar *p=new uchar[9]; Mat a(3,3,CV_8UC1,p); 那样a矩阵的数据区还是指向p的,如果delete了p数组,a的指针...
  • u011867581
  • u011867581
  • 2014年04月18日 14:59
  • 754

Open CV学习记录(二十二)—图像处理基本知识

Mat 的初始化可以使用复制构造函数或者赋值运算符,不进行储存像素值的矩阵复制,只复制矩阵头。 clone()和copyTo进行整体复制。 设定某部分区域,可以使用Rect或Range HSV把...
  • u014413083
  • u014413083
  • 2016年11月15日 14:11
  • 818
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CV图像转换
举报原因:
原因补充:

(最多只允许输入30个字)