OpenCV图像数据转换:64F与8U类型处理及cvConvertScale应用
本文介绍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转换的内容即为全部分享,希望能提供参考,欢迎支持。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









