cvConvert用法

最近在做图像的FFT变换时,需要将8位的图像转为64位图像处理,以提高计算精度,查了一下手册,cvConvert可以实现这个功能。按照手册说明“将源图像数据类型转换为目标图像类型”,使用了以下代码进行转换:

IplImage* imbufa= cvLoadImage("1.jpg",CV_LOAD_IMAGE_GRAYSCALE);
       IplImage* imbufb= cvLoadImage("2.jpg",CV_LOAD_IMAGE_GRAYSCALE);
       IplImage* ima_r=cvCreateImage(cvGetSize(imbufa),IPL_DEPTH_64F,1);
       cvConvert(imbufa,ima_r);
       cvConvert(imbufb,ima_r);

...

然后在后面进行数据复制的时候报错,原因是图像depth不符,调试发现imbufa以及imbufb仍然是8位,而没有变为预想的64位。翻了手册没有发现什么错误,又上网查了一下,发现一个哥们的博客上有这个函数的用法,上面还举了一个很详细的例子,跟我的用法相同。但是为什么结果不对呢?~

后来我把ima_r赋0值,然后将变换前后图像显示出来,发现变换前ima_r图像为0值图像,而变换后为黑白图像,即有非零像素值,这就是说变换后ima_r被赋值了,就是说cvConvert(src,dst)不但将src图像数据类型改变,还执行了将src的数据赋值到dst的操作。

为了验证这个想法,我又创建了一个8位的图像指针,然后按照该想法将64位的ima_r转到8位的新图像,然后显示出来,结果和imbufa一样。

结论:cvConvert(src,dst)执行两个操作:将src图像数据类型改变为dst图像数据类型;将src的数据赋值到dst。

PS:起先我以为原图像的数据格式也会被改变,原来不会,只是将源图像src的数据按目标图像dst的数据格式转换并赋给dst,就是这样了

因为IplImage里的数据,你只能用uchar的形式存放,当你需要这些图像数据看作数据矩阵来运算时,0~255的精度显然满足不了要求;然而CvMat里却可以存放任意通道数、任意格式的数据,这个机制方便了研究中的这种需求,转化为矩阵就可以进行更自由的计算

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用 Delphi-OpenCV 进行两张图像对比的示例代码: ```delphi uses CvTypes, CvImgProc, CvHighgui; function CompareImages(const Image1, Image2: string): Single; var Img1, Img2: pIplImage; Hist1, Hist2: pCvHistogram; Mat1, Mat2: pCvMat; begin // 读取图像 Img1 := LoadImage(Image1); Img2 := LoadImage(Image2); // 转换为灰度图像 cvCvtColor(Img1, Img1, CV_BGR2GRAY); cvCvtColor(Img2, Img2, CV_BGR2GRAY); // 计算直方图 Hist1 := cvCreateHist([256], CV_HIST_ARRAY, cvCreateMat(1, 256, CV_32FC1), 1); Hist2 := cvCreateHist([256], CV_HIST_ARRAY, cvCreateMat(1, 256, CV_32FC1), 1); Mat1 := cvCreateMat(Img1.height, Img1.width, CV_8UC1); Mat2 := cvCreateMat(Img2.height, Img2.width, CV_8UC1); cvConvert(Img1, Mat1); cvConvert(Img2, Mat2); cvCalcHist(@Mat1, Hist1); cvCalcHist(@Mat2, Hist2); // 比较直方图 Result := cvCompareHist(Hist1, Hist2, CV_COMP_CORREL); // 释放资源 cvReleaseMat(@Mat1); cvReleaseMat(@Mat2); cvReleaseHist(@Hist1); cvReleaseHist(@Hist2); cvReleaseImage(@Img1); cvReleaseImage(@Img2); end; ``` 在上述代码中,`Image1` 和 `Image2` 分别为待比较的两张图像的文件路径。我们首先使用 Delphi-OpenCV 中提供的 `LoadImage` 函数读取图像,并使用 `cvCvtColor` 函数将图像转换为灰度图像。然后,我们使用 `cvCalcHist` 函数计算两张图像的直方图,并使用 `cvCompareHist` 函数比较两个直方图的相似度。最后,我们返回相似度的值。需要注意的是,我们在比较直方图时使用了 `CV_COMP_CORREL` 参数,表示使用相关性作为相似度的度量方式。你可以根据具体需求调整参数值。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值