利用OpenCV中對圖像數(shù)據進行64F和8U轉換的方式
在OpenCV中很多對數(shù)據的運算都需要轉換為64F類型,比如伽瑪變換,這個很明顯要求冪的底數(shù)是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()對圖像數(shù)據作線性變換~
在OpenCV的IplImage結構體char * imageData成員的說明中,官方文檔明確提示大家不能對這個指針所對應的數(shù)據直接操作,否則會帶來意想不到的錯誤。
原話是這樣的:
Do not assign imageData directly. Use SetData().
我曾經就犯傻直接進行操作,結果造成數(shù)據類型不匹配,最后還非得去修改頭文件中的char * imageData為unsigned char * imageData才解決問題,然而這種操作是極其不妥的~正確的做法是用OpenCV提供的各種函數(shù)來對圖像數(shù)據就行操作!比如cvConvertScale()、Use SetData()之類的!
這里我用cvConvertScale()來實現(xiàn)灰度圖像的線性變換,程序非常簡潔,而且沒有任何問題!
源代碼如下:
#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); //創(chuàng)建輸出的圖像 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中對圖像數(shù)據進行64F和8U轉換的方式就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Python 定義分數(shù)類實現(xiàn)其基本運算(示例代碼)
這篇文章主要介紹了Python 定義分數(shù)類實現(xiàn)其基本運算,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-06-06Python實現(xiàn)將藍底照片轉化為白底照片功能完整實例
這篇文章主要介紹了Python實現(xiàn)將藍底照片轉化為白底照片功能,結合完整實例形式分析了Python基于cv2庫進行圖形轉換操作的相關實現(xiàn)技巧,需要的朋友可以參考下2019-12-12Python Django框架url反向解析實現(xiàn)動態(tài)生成對應的url鏈接示例
這篇文章主要介紹了Python Django框架url反向解析實現(xiàn)動態(tài)生成對應的url鏈接,結合實例形式分析了Django框架URL反向解析具體原理與應用操作技巧,需要的朋友可以參考下2019-10-10