OpenCV图像数据转换:64F与8U类型处理及cvConvertScale应用

晚来风
晚来风
发布时间:2026-10-13 | 3人浏览过
原创

本文介绍OpenCV中图像数据从64F到8U的转换方法,重点讲解cvConvertScale函数在灰度图像线性变换中的应用。通过示例代码展示如何避免直接操作imageData指针,确保数据类型匹配与显示正常,并提供完整的C++实现参考。

OpenCV图像类型转换基础

在OpenCV中,许多数据运算要求将图像数据转换为64F(double)类型,例如伽马变换,这明确要求幂运算的底数为double类型。

然而,cvShowImage函数要求图像数据必须为8U(unsigned char)类型才能正常显示,否则会导致显示区域一片空白。

因此,在实际开发中经常需要进行这两种类型的转换,具体实现方法可通过后续代码示例了解。


IplImage *pSrcImage = cvLoadImage("pout.jpg", CV_LOAD_IMAGE_UNCHANGED); 
IplImage *pGrayImage_8U = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 1); 
IplImage *pGrayImage_8U_2 = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 1); 

IplImage *pGrayImage_64F=cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_64F, 1);

cvCvtColor(pSrcImage, pGrayImage_8U, CV_BGR2GRAY); //RGB转灰度图像

cvConvertScale(pGrayImage_8U, pGrayImage_64F); //8U转64F
cvConvertScale(pGrayImage_64F, pGrayImage_8U_2) //64F转8U

cvConvertScale线性变换应用

补充知识:OpenCV提供了cvConvertScale函数,用于对图像数据进行线性变换处理。

在OpenCV的IplImage结构体中,char * imageData成员有明确说明:官方文档指出不应直接对该指针指向的数据进行操作,否则可能引发不可预知的错误。

官方文档的具体提示如下:

Do not assign imageData directly. Use SetData().

曾有人尝试直接操作该指针,导致数据类型不匹配,最终不得不修改头文件中的char * imageData为unsigned char * imageData才解决问题,这种做法极不推荐。正确的方法是使用OpenCV提供的函数(如cvConvertScale或SetData)来操作图像数据。

此处使用cvConvertScale实现灰度图像的线性变换,代码简洁且无错误。

完整代码示例与结果

源代码如下:


#include <opencv2/opencv.hpp> 
#include <opencv2/legacy/compat.hpp> 
using namespace std; 
#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"") 

int main()
{
int i=0;
unsigned char *imageData_1;
unsigned char *imageData_2;
const char *pstrWindowsATitle = "原图像(opencv66.net)"; 
const char *pstrWindowsBTitle = "线性变换后的图像(opencv66.net))"; 
//从文件中加载原图 
IplImage *pSrcImage = cvLoadImage("coins.png", CV_LOAD_IMAGE_UNCHANGED); 
//创建输出的图像
IplImage *pOutImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U,1);
cvConvertScale(pSrcImage,pOutImage,2,-55); //利用cvConvertScale增加对比度的线性变换,线性变换中的比例因子k=2 偏移值b=-55
cvNamedWindow(pstrWindowsATitle, CV_WINDOW_AUTOSIZE); 
cvShowImage(pstrWindowsATitle,pSrcImage); 
cvNamedWindow(pstrWindowsBTitle, CV_WINDOW_AUTOSIZE); 
cvShowImage(pstrWindowsBTitle, pOutImage); 
cvWaitKey(0); 
cvDestroyWindow(pstrWindowsATitle); 
cvDestroyWindow(pstrWindowsBTitle); 
cvReleaseImage(&pSrcImage); 
cvReleaseImage(&pOutImage); 
return 0;
}

运行结果如下图所示(与MATLAB中的运行结果一致)。

MATLAB运行后的结果

以上关于OpenCV中图像数据64F与8U转换的内容即为全部分享,希望能提供参考,欢迎支持。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表