利用OpenCV中对图像数据进行64F和8U转换的方式

 更新时间:2020年06月03日 09:08:21   作者:清溪算法老号  
这篇文章主要介绍了利用OpenCV中对图像数据进行64F和8U转换的方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

在OpenCV中很多对数据的运算都需要转换为64F类型,比如伽玛变换,这个很明显要求幂的底数是double类型~

而cvShowImage()又要求是U8才能显示,否则显示出来是一片空白!

所以经常要进行转换,怎么做呢?看了下面的几行代码你就知道了!

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

补充知识:OpenCV中利用cvConvertScale()对图像数据作线性变换~

在OpenCV的IplImage结构体char * imageData成员的说明中,官方文档明确提示大家不能对这个指针所对应的数据直接操作,否则会带来意想不到的错误。

原话是这样的:

Do not assign imageData directly. Use SetData().

我曾经就犯傻直接进行操作,结果造成数据类型不匹配,最后还非得去修改头文件中的char * imageData为unsigned char * imageData才解决问题,然而这种操作是极其不妥的~正确的做法是用OpenCV提供的各种函数来对图像数据就行操作!比如cvConvertScale()、Use 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中高效的json对比库deepdiff详解

    Python中高效的json对比库deepdiff详解

    deepdiff模块常用来校验两个对象是否一致,包含3个常用类,DeepDiff,DeepSearch和DeepHash,其中DeepDiff最常用,可以对字典,可迭代对象,字符串等进行对比,使用递归地查找所有差异,今天我们就学习一下快速实现代码和文件对比的库–deepdiff
    2022-07-07
  • 使用python+whoosh实现全文检索

    使用python+whoosh实现全文检索

    今天小编就为大家分享一篇使用python+whoosh实现全文检索,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • python将logging模块封装成单独模块并实现动态切换Level方式

    python将logging模块封装成单独模块并实现动态切换Level方式

    这篇文章主要介绍了python将logging模块封装成单独模块并实现动态切换Level方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05
  • Python中用Spark模块的使用教程

    Python中用Spark模块的使用教程

    这篇文章主要介绍了Python中用Spark模块的使用教程,来自IBM官方技术文档,需要的朋友可以参考下
    2015-04-04
  • OpenCV2学习笔记之视频流读取与处理

    OpenCV2学习笔记之视频流读取与处理

    为OpenCV是搞计算机视觉必须要掌握的基础,这篇文章主要给大家介绍了关于OpenCV2学习笔记之视频流读取与处理的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-01-01
  • python字典的setdefault的巧妙用法

    python字典的setdefault的巧妙用法

    这篇文章主要介绍了python字典的setdefault的巧妙用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • python 画三维图像 曲面图和散点图的示例

    python 画三维图像 曲面图和散点图的示例

    今天小编就为大家分享一篇python 画三维图像 曲面图和散点图的示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • python如何将两张图片生成为全景图片

    python如何将两张图片生成为全景图片

    这篇文章主要为大家详细介绍了python如何将两张图片生成为全景图片,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • pytest实现多种调用方式

    pytest实现多种调用方式

    pytest是一个非常成熟的全功能的Python测试框架,本文主要介绍了pytest多种调用方式,具有一定的参考价值,感兴趣的可以了解一下
    2023-12-12
  • Jupyter notebook 远程配置及SSL加密教程

    Jupyter notebook 远程配置及SSL加密教程

    这篇文章主要介绍了Jupyter notebook 远程配置及SSL加密教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04

最新评论