利用OpenCV中對圖像數(shù)據(jù)進(jìn)行64F和8U轉(zhuǎn)換的方式
在OpenCV中很多對數(shù)據(jù)的運(yùn)算都需要轉(zhuǎn)換為64F類型,比如伽瑪變換,這個(gè)很明顯要求冪的底數(shù)是double類型~
而cvShowImage()又要求是U8才能顯示,否則顯示出來是一片空白!
所以經(jīng)常要進(jìn)行轉(zhuǎn)換,怎么做呢?看了下面的幾行代碼你就知道了!
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轉(zhuǎn)灰度圖像
cvConvertScale(pGrayImage_8U, pGrayImage_64F); //8U轉(zhuǎn)64F
cvConvertScale(pGrayImage_64F, pGrayImage_8U_2) //64F轉(zhuǎn)8U
補(bǔ)充知識:OpenCV中利用cvConvertScale()對圖像數(shù)據(jù)作線性變換~
在OpenCV的IplImage結(jié)構(gòu)體char * imageData成員的說明中,官方文檔明確提示大家不能對這個(gè)指針?biāo)鶎?yīng)的數(shù)據(jù)直接操作,否則會帶來意想不到的錯誤。
原話是這樣的:
Do not assign imageData directly. Use SetData().
我曾經(jīng)就犯傻直接進(jìn)行操作,結(jié)果造成數(shù)據(jù)類型不匹配,最后還非得去修改頭文件中的char * imageData為unsigned char * imageData才解決問題,然而這種操作是極其不妥的~正確的做法是用OpenCV提供的各種函數(shù)來對圖像數(shù)據(jù)就行操作!比如cvConvertScale()、Use SetData()之類的!
這里我用cvConvertScale()來實(shí)現(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;
}
運(yùn)行結(jié)果如下圖所示(和我在MATLAB中的運(yùn)行結(jié)果一致哦)

MATLAB運(yùn)行后的結(jié)果

以上這篇利用OpenCV中對圖像數(shù)據(jù)進(jìn)行64F和8U轉(zhuǎn)換的方式就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python裝飾器使用實(shí)例:驗(yàn)證參數(shù)合法性
這篇文章主要介紹了Python裝飾器使用實(shí)例:驗(yàn)證參數(shù)合法性,本文直接給出代碼實(shí)例,代碼中包含詳細(xì)注釋,需要的朋友可以參考下2015-06-06
Python 定義分?jǐn)?shù)類實(shí)現(xiàn)其基本運(yùn)算(示例代碼)
這篇文章主要介紹了Python 定義分?jǐn)?shù)類實(shí)現(xiàn)其基本運(yùn)算,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06
python通用讀取vcf文件的類(復(fù)制粘貼即可用)
這篇文章主要介紹了python通用讀取vcf文件的類(可以直接復(fù)制粘貼使用) ,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02
Python實(shí)現(xiàn)將藍(lán)底照片轉(zhuǎn)化為白底照片功能完整實(shí)例
這篇文章主要介紹了Python實(shí)現(xiàn)將藍(lán)底照片轉(zhuǎn)化為白底照片功能,結(jié)合完整實(shí)例形式分析了Python基于cv2庫進(jìn)行圖形轉(zhuǎn)換操作的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-12-12
一些讓Python代碼簡潔的實(shí)用技巧總結(jié)
隨著項(xiàng)目代碼行數(shù)的增加,不可避免的遇到軟件架構(gòu)腐敗的問題,所以如何寫出簡潔的代碼至關(guān)重要,這篇文章主要給大家介紹了一些讓Python代碼簡潔的實(shí)用技巧,需要的朋友可以參考下2021-08-08
Python Django框架url反向解析實(shí)現(xiàn)動態(tài)生成對應(yīng)的url鏈接示例
這篇文章主要介紹了Python Django框架url反向解析實(shí)現(xiàn)動態(tài)生成對應(yīng)的url鏈接,結(jié)合實(shí)例形式分析了Django框架URL反向解析具體原理與應(yīng)用操作技巧,需要的朋友可以參考下2019-10-10
解決pycharm py文件運(yùn)行后停止按鈕變成了灰色的問題
今天小編就為大家分享一篇解決pycharm py文件運(yùn)行后停止按鈕變成了灰色的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-11-11

