數字圖像處理及工程應用章-(16)課件_第1頁
數字圖像處理及工程應用章-(16)課件_第2頁
數字圖像處理及工程應用章-(16)課件_第3頁
數字圖像處理及工程應用章-(16)課件_第4頁
數字圖像處理及工程應用章-(16)課件_第5頁
已閱讀5頁,還剩105頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

2022/12/29第1頁第16章OpenCV圖像處理16.1基礎數據結構16.1.1cv命名空間1、使用指示字2、通過cv::說明符#include"opencv2/core/core.hpp"usingnamespacecv;

//…MatH=imread(“lena.jpg”);#include"opencv2/core/core.hpp"http://…cv::MatH=imread(“lena.jpg”);2022/12/28第1頁第16章OpenCV圖像處理12022/12/29第2頁第16章OpenCV圖像處理16.1.2cv數據結構1、數據類型類型名含義等價類型類型名含義等價類型CV_8U8bit無符號字符型ucharCV_32S32bit有符號整型intCV_8S8bit有符號整型scharCV_32F32bit浮點類型floatCV_16U16bit無符號整型ushortCV_64F64bit浮點類型doubleCV_16S16bit有符號整型short注:可以用于定義多通道數據類型注意:其中使用最多的是類型是CV_8U_C1和CV_8U_C3,分別為單通道和三通道的8位無符號整型2022/12/28第2頁第16章OpenCV圖像處理12022/12/29第3頁第16章OpenCV圖像處理2、基礎結構注意:其中常用的是類型是Point、Size、Ptr、Rect和Scalar。2022/12/28第3頁第16章OpenCV圖像處理22022/12/29第4頁第16章OpenCV圖像處理16.1.3Mat基本圖像容器1、Mat結構頭2022/12/28第4頁第16章OpenCV圖像處理12022/12/29第5頁第16章OpenCV圖像處理2、Mat結構成員函數(1)矩陣的創建方法2022/12/28第5頁第16章OpenCV圖像處理22022/12/29第6頁【例.1】:MatM(7,7,CV_32FC2,Scalar(1,3));//創建7×7的復數矩陣,并用1+3j填充M.create(100,60,CV_8UC(15));//創建100×60的15通道的8bit無符號字符型矩陣M.create(Size(60,100),CV_8UC(15));//與上一行代碼等價intsz[]={100,100,100};MatbigCube(3,sz,CV_8U,Scalar::all(0));第16章OpenCV圖像處理2022/12/28第6頁【例.1】:第16章OpenC2022/12/29第7頁第16章OpenCV圖像處理【例.2】:繼上例,欲將矩陣M的第7列拷貝給第1列MatM1=M.col(1);M.col(7).copyTo(M1);注意:矩陣的拷貝(copyTo方法)拷貝的只是矩陣頭并修改源矩陣的refcounter指針,并不將源矩陣的實際數據拷貝至目的矩陣,故上例目的不能達到。(2)矩陣的拷貝2022/12/28第7頁第16章OpenCV圖像處理【2022/12/29第8頁第16章OpenCV圖像處理【例.3】:新建一個三通道圖像img,并將(10,10,100,100)的矩形區域置為綠色Matimg(Size(320,240),CV_8UC3);Matroi(img,Rect(10,10,100,100));roi=Scalar(0,255,0);【例.4】:利用數組初始化矩陣M,再將矩陣M克隆至矩陣Ndoublem[3][3]={{1,2,3},{4,5,6},{7,8,9}};MatM=Mat(3,3,CV_64F,m);MatN=M.clone();矩陣N的內容將和矩陣M的完全一致,且都獨立分配內存空間。(3)矩陣的克隆【建議使用】2022/12/28第8頁第16章OpenCV圖像處理【2022/12/29第9頁第16章OpenCV圖像處理(4)矩陣的初始化【例.6】:產生“0”/“1”矩陣MatA;A=Mat::zeros(3,3,CV_32F);MatB=Mat::ones(100,100,CV_8U)*3【例.5】:intm[3][3]={{1,2,3},{4,5,6},{7,8,9}};MatM=Mat(3,3,CV_8U,m);2022/12/28第9頁第16章OpenCV圖像處理(2022/12/29第10頁第16章OpenCV圖像處理(5)矩陣的存取【例.7】:at方法MatH(100,100,CV_64F);for(inti=0;i<H.rows;i++)for(intj=0;j<H.cols;j++)H.at<double>(i,j)=255.H.at<double>(i,j);(6)矩陣的運算①點積:要求兩個矩陣(M、N)的大小、類型相同M.dot(N);2022/12/28第10頁第16章OpenCV圖像處理2022/12/29第11頁第16章OpenCV圖像處理②叉積:要求兩個矩陣必須為相同大小、類型的三元組浮點類型M.cross(N);③乘除:multiply(M,N,D,0.8);//點乘divide(M,N,D);//點除M.mul(5/N);//等價于divide(M,N,5);D=M*N;//兩個矩陣相乘④加減add(M,N,D);//D=M+Nsubtract(M,N,D);//D=M.N2022/12/28第11頁第16章OpenCV圖像處理2022/12/29第12頁第16章OpenCV圖像處理⑤求逆N=M.inv();⑥轉置N=M.t();3、Mat結構成員函數OpenCV提供了非常豐富的矩陣操作的API函數,幾乎囊括了所有必需的基本矩陣運算,這些函數包括:絕對值、絕對差、求逆、對數運算、指數運算、模運算、特征值求解、最大(小)值、轉置、歸一化、奇異值分解等等,詳見OpenCV參考手冊。2022/12/28第12頁第16章OpenCV圖像處理2022/12/29第13頁第16章OpenCV圖像處理16.2.1輸入/輸出16.2OpenCV圖像操作1、裝載圖像Mat

imread(conststring&

filename,int

flags=1

);//適用于C++2022/12/28第13頁第16章OpenCV圖像處理2022/12/29第14頁第16章OpenCV圖像處理2、保存圖像bool

imwrite(conststring&

filename,InputArray

image,constvector<int>&

params=vector<int>())2022/12/28第14頁第16章OpenCV圖像處理2022/12/29第15頁第16章OpenCV圖像處理16.2.2圖像存取1、獲取像素值①單通道圖像: Scalarintensity=img.at<uchar>(x,y);②三通道圖像:按B、G、R排列

Vec3bintensity=img.at<Vec3b>(x,y); ucharblue=intensity.val[0]; uchargreen=intensity.val[1]; ucharred=intensity.val[2];

Vec3fintensity=img.at<Vec3f>(x,y); floatblue=intensity.val[0]; floatgreen=intensity.val[1]; floatred=intensity.val[2];2022/12/28第15頁第16章OpenCV圖像處理2022/12/29第16頁第16章OpenCV圖像處理2、修改像素值 img.at<uchar>(x,y)=128;注:<…>中的類型須與圖像數據的實際類型一致。16.2.3底層操作1、賦值 Img=Scalar(0);2、ROI操作 Rectr(10,10,100,100); MatsmallImg=img(r);3、色彩轉換

cvtColor(img,grey,CV_BGR2GRAY);2022/12/28第16頁第16章OpenCV圖像處理2022/12/29第17頁第16章OpenCV圖像處理16.2.4圖像顯示 Matimg=imread("image.jpg");

namedWindow("image",CV_WINDOW_AUTOSIZE);

imshow("image",img);

waitKey();16.2.5圖像處理API1、圖像濾波medianFilter,GaussianFilter,bilateralFilter,blur,boxFilter,filter2D,GaussianBlur,Smooth,medianBlur,Laplacian,Sobel,imdilate,imerode2022/12/28第17頁第16章OpenCV圖像處理2022/12/29第18頁第16章OpenCV圖像處理2、圖像變換invertAffineTransform,warpAffine,warpPerspective,LogPolar,resize,dct,dft,adaptiveThreshold,cvtColor,floodFill,integral,watershed

3、圖像直方圖calcHist,equalizeHist,NormalizeHist,ThreshHist4、結構分析與形狀描述moments,HuMoments,findContours,drawContours,contourArea,ApproxChains,boundingRect,……5、特征檢測Canny,HoughCircles,HoughLines,MatchTemplate6、視頻操作VideoCapture::open,isOpened,release,grab,……VideoWriter::open,isOpened,write2022/12/28第18頁第16章OpenCV圖像處理2022/12/29第19頁第16章OpenCV圖像處理16.3.1控制臺模式16.3OpenCV編程舉例1、基本原理給圖像添加噪聲,實際上就是對圖像中像素點的灰度值進行隨機修改,通過隨機數產生函數取得像素點的行、列坐標,然后對該像素點的灰度值按照事先約定的方式置為0或255的過程;圖像平滑的方式,按照數字圖像處理的理論有多種方式,如均值濾波、中值濾波、高斯平滑濾波等等,這些基本的圖像處理算法在OpenCV中都提供了相應的API函數。本例采用中值濾波進行平滑處理。

2022/12/28第19頁第16章OpenCV圖像處理2022/12/29第20頁第16章OpenCV圖像處理2、程序源碼(1)包含所需的頭文件#include<iostream>//標準輸入/輸出流#include<vector> //矢量//OpenCV圖像處理包 #include"opencv2/imgproc/imgproc.hpp"http://OpenCV高層GUI包 #include"opencv2/highgui/highgui.hpp"http://OpenCV二維特征檢測與描述包 #include"opencv2/features2d/features2d.hpp"(2)聲明命名空間 usingnamespacestd;

//C++標準std命名空間usingnamespacecv; //OpenCV命名空間

2022/12/28第20頁第16章OpenCV圖像處理2022/12/29第21頁第16章OpenCV圖像處理(3)自定義函數原型聲明(可選)voidaddNoise(Mat&image,intn,intnoise);//圖像加噪自定義函數

(4)main函數:主函數intmain(void){//建立三個窗口,分別用于顯示源圖像、加噪后圖像和平滑后的圖像

namedWindow("Source",CV_WINDOW_AUTOSIZE);namedWindow("Noised",CV_WINDOW_AUTOSIZE);namedWindow("Smoothed",CV_WINDOW_AUTOSIZE);//定義圖像容器src,并加載圖像lena.pngMatsrc=imread("lena.png",CV_BGR2GRAY);if(src.empty())return1;//判斷是否加載成功

imshow("Source",src); //顯示源圖像

addNoise(src,2000,255);//給圖像加入隨機噪聲imshow("Noised",src); //顯示加噪后的圖像

medianBlur(src,src,3);//對加噪后的圖像進行中值濾波平滑處理imshow("Smoothed",src); //顯示平滑后的圖像waitKey(); //等待用戶按鍵}

2022/12/28第21頁第16章OpenCV圖像處理2022/12/29第22頁第16章OpenCV圖像處理(5)addNoise函數:用于對圖像添加隨機噪聲//入口參數:image—待添加噪聲的源圖像;n—加入噪聲點個數;noise—噪聲類型//出口參數:無voidaddNoise(Mat&image,intn=1000,intnoise=0){srand(getTickCount()); //產生隨機數種子if(image.empty())return;//判斷源圖像是否有效for(intl=0;l<n;l++){ //循環添加噪聲點inti=rand()%image.rows; //隨機噪聲點行坐標intj=rand()%image.cols; //隨機噪聲點列坐標if(image.channels()>=3){ //圖像通道數判斷for(intk=0;k<image.channels();k++)//多通道image.at<Vec3b>(i,j)[k]=noise;//添加噪聲}else{ //單通道 image.at<uchar>(i,j)=noise;//添加噪聲}}}2022/12/28第22頁第16章OpenCV圖像處理2022/12/29第23頁第16章OpenCV圖像處理2、運行結果

圖16.1加噪后的圖像圖16.2中值濾波平滑后的圖像2022/12/28第23頁第16章OpenCV圖像處理2022/12/29第24頁第16章OpenCV圖像處理16.3.2GUI界面模式按照15.2節的方法,(1)在Code::Blocks中新建工程;(2)工程模板選擇“wxWidgetsProjects”;(3)GUI界面設計器選擇“wxFormbuilder”;(4)應用程序類型選擇“FrameBased”;(5)其余頁面選項可根據實際情況確定,如wxWidgets是以動態鏈接庫還是靜態鏈接庫等等。關鍵步驟如圖16.3和圖16.4所示。

1、新建工程2022/12/28第24頁第16章OpenCV圖像處理2022/12/29第25頁第16章OpenCV圖像處理圖16.3GUI設計器及應用程序類型選擇圖16.4wxWidgets庫設置wxSmith、wxFormbuilder分別是Code::Blocks自帶的設計器插件和為外部GUI設計器。建議初學者使用wxFormbuilder。【UsewxWidgetsDLL】:勾選表示使用DLL方式。【Enableunicode】:勾選表示支持Unicode字符編碼。2022/12/28第25頁第16章OpenCV圖像處理2022/12/29第26頁第16章OpenCV圖像處理2、GUI界面設計本GUI案例采用如表16.4所示的wxWidgets組件來設計完成,GUI界面的外觀如圖16.5所示。組件類功能在本案例中用途wxFrame框架窗口GUI頂層窗口wxMenuBar菜單提供菜單操作wxSizer布局容器提供GUI界面中各組件的布局功能wxStaticLine靜態線條用于GUI界面不同區域的分割線wxStaticText靜態文本用于顯示字符信息wxTextCtrl文本控件用于接收用戶輸入數據wxChoice選項控件提供用戶選擇(噪聲類型、平滑算法)wxButton按鈕執行某種操作(如加噪、平滑濾波)表16.4所用到的wxWidgets組件2022/12/28第26頁第16章OpenCV圖像處理2022/12/29第27頁第16章OpenCV圖像處理圖16.5wxFormbuilder下的GUI界面外觀2022/12/28第27頁第16章OpenCV圖像處理2022/12/29第28頁第16章OpenCV圖像處理(1)菜單處理:本例只為“F文件”菜單中的“O打開”命令項的OnMenuSelection事件添加處理函數“OnFileopen”處理函數,完成打開一個圖像文件的操作。其余菜單項的事件處理采用系統生成的默認操作。(2)命令按鈕:分別為“加噪”、“平滑”兩個按鈕的“OnButtonClick”和“OnUpdateUI”事件添加處理函數:OnBtnAddNoise、OnUpdateUIAddnoise、OnBtnSmooth和OnUpdateUISmooth。3、生成代碼按15.3的方法,點擊工具欄“GenerateCode”按鈕和菜單“Tools\GenerateInheritedClass”生成GUI界面的C++代碼和派生類,并將派生類中事件處理函數的聲明和實現代碼框架拷貝到設計主文件,修改并完善相關代碼。2022/12/28第28頁第16章OpenCV圖像處理2022/12/29第29頁第16章OpenCV圖像處理4、代碼分析本例的源代碼包含三個類和一個資源文件:應用程序類ImageSmoothApp、GUI界面類GUIFrame、resource.rc和ImageSmoothMain。(1)應用程序類ImageSmoothApp類2022/12/28第29頁第16章OpenCV圖像處理2022/12/29第30頁第16章OpenCV圖像處理2022/12/28第30頁第16章OpenCV圖像處理2022/12/29第31頁第16章OpenCV圖像處理(2)設計主文件ImageSmoothFrame類2022/12/28第31頁第16章OpenCV圖像處理2022/12/29第32頁第16章OpenCV圖像處理2022/12/28第32頁第16章OpenCV圖像處理2022/12/29第33頁第16章OpenCV圖像處理2022/12/28第33頁第16章OpenCV圖像處理2022/12/29第34頁第16章OpenCV圖像處理2022/12/28第34頁第16章OpenCV圖像處理2022/12/29第35頁第16章OpenCV圖像處理2022/12/28第35頁第16章OpenCV圖像處理2022/12/29第36頁第16章OpenCV圖像處理2022/12/28第36頁第16章OpenCV圖像處理2022/12/29第37頁第16章OpenCV圖像處理2022/12/28第37頁第16章OpenCV圖像處理2022/12/29第38頁第16章OpenCV圖像處理2022/12/28第38頁第16章OpenCV圖像處理2022/12/29第39頁第16章OpenCV圖像處理2022/12/28第39頁第16章OpenCV圖像處理2022/12/29第40頁第16章OpenCV圖像處理2022/12/28第40頁第16章OpenCV圖像處理2022/12/29第41頁第16章OpenCV圖像處理2022/12/28第41頁第16章OpenCV圖像處理2022/12/29第42頁第16章OpenCV圖像處理2022/12/28第42頁第16章OpenCV圖像處理2022/12/29第43頁第16章OpenCV圖像處理2022/12/28第43頁第16章OpenCV圖像處理2022/12/29第44頁第16章OpenCV圖像處理2022/12/28第44頁第16章OpenCV圖像處理2022/12/29第45頁第16章OpenCV圖像處理(3)GUIFrame類GUIFrame是wxFormbuilder根據用戶GUI設計的布局自動生成的代碼,并作為類ImageSmoothFrame的父類加以繼承。關于GUIFrame類的代碼解析,此處從略。5、編譯、鏈接與執行(1)右鍵點擊【ImageSmooth】【Buildoptions】如圖16.6所示;(2)相關選項的配置如圖16.7所示2022/12/28第45頁第16章OpenCV圖像處理2022/12/29第46頁第16章OpenCV圖像處理圖16.6工程構建選項2022/12/28第46頁第16章OpenCV圖像處理2022/12/29第47頁第16章OpenCV圖像處理注意:在指定wxWidgets鏈接庫的時候,不僅要保證選中的庫與當前工程的類型是一致的(動態庫或靜態庫),而且庫的排列順序也有先后之分。具體可以參考wxWidgets自帶的samples。圖16.7工程構建選項配置對話框2022/12/28第47頁第16章OpenCV圖像處理2022/12/29第48頁第16章OpenCV圖像處理編譯、鏈接成功后,點擊工具欄運行按鈕,待程序啟動后通過“文件”菜單打開一個圖像文件,添加噪聲,然后進行平滑處理,結果如圖16.8~12所示。圖16.8為加載圖像時的界面2022/12/28第48頁第16章OpenCV圖像處理2022/12/29第49頁第16章OpenCV圖像處理圖16.9打開lena.png圖像2022/12/28第49頁第16章OpenCV圖像處理2022/12/29圖16.10添加椒鹽噪聲和平滑效果第50頁第16章OpenCV圖像處理2022/12/28圖16.10添加椒鹽噪聲和平滑效果第52022/12/29第51頁第16章OpenCV圖像處理圖16.11添加高斯噪聲和平滑效果2022/12/28第51頁第16章OpenCV圖像處理2022/12/29圖16.12Linux環境下運行效果第52頁第16章OpenCV圖像處理2022/12/28圖16.12Linux環境下運行效果第2022/12/29第53頁第16章OpenCV圖像處理16.4本章小結(1)講述了OpenCV使用的初步知識,介紹了OpenCV的基礎數據結構、數據類型、Mat類型圖像容器、OpenCV圖像操作的常用API函數等。(2)重點講述了在Code::Blocks環境下如何利用OpenCV進行圖像處理,并以圖像加噪與平滑處理為例介紹了兩種不同的設計模式:控制臺模式和GUI界面模式,給出了具體的設計過程、測試結果,特別是如何結合案例要求進行GUI界面的設計和代碼的編寫,從而進一步掌握利用OpenCV進行數字圖像處理的實際工程應用奠定必要的基礎。2022/12/28第53頁第16章OpenCV圖像處理感謝感謝謝謝,精品課件資料搜集謝謝,精品課件資料搜集2022/12/29第56頁第16章OpenCV圖像處理16.1基礎數據結構16.1.1cv命名空間1、使用指示字2、通過cv::說明符#include"opencv2/core/core.hpp"usingnamespacecv;

//…MatH=imread(“lena.jpg”);#include"opencv2/core/core.hpp"http://…cv::MatH=imread(“lena.jpg”);2022/12/28第1頁第16章OpenCV圖像處理12022/12/29第57頁第16章OpenCV圖像處理16.1.2cv數據結構1、數據類型類型名含義等價類型類型名含義等價類型CV_8U8bit無符號字符型ucharCV_32S32bit有符號整型intCV_8S8bit有符號整型scharCV_32F32bit浮點類型floatCV_16U16bit無符號整型ushortCV_64F64bit浮點類型doubleCV_16S16bit有符號整型short注:可以用于定義多通道數據類型注意:其中使用最多的是類型是CV_8U_C1和CV_8U_C3,分別為單通道和三通道的8位無符號整型2022/12/28第2頁第16章OpenCV圖像處理12022/12/29第58頁第16章OpenCV圖像處理2、基礎結構注意:其中常用的是類型是Point、Size、Ptr、Rect和Scalar。2022/12/28第3頁第16章OpenCV圖像處理22022/12/29第59頁第16章OpenCV圖像處理16.1.3Mat基本圖像容器1、Mat結構頭2022/12/28第4頁第16章OpenCV圖像處理12022/12/29第60頁第16章OpenCV圖像處理2、Mat結構成員函數(1)矩陣的創建方法2022/12/28第5頁第16章OpenCV圖像處理22022/12/29第61頁【例.1】:MatM(7,7,CV_32FC2,Scalar(1,3));//創建7×7的復數矩陣,并用1+3j填充M.create(100,60,CV_8UC(15));//創建100×60的15通道的8bit無符號字符型矩陣M.create(Size(60,100),CV_8UC(15));//與上一行代碼等價intsz[]={100,100,100};MatbigCube(3,sz,CV_8U,Scalar::all(0));第16章OpenCV圖像處理2022/12/28第6頁【例.1】:第16章OpenC2022/12/29第62頁第16章OpenCV圖像處理【例.2】:繼上例,欲將矩陣M的第7列拷貝給第1列MatM1=M.col(1);M.col(7).copyTo(M1);注意:矩陣的拷貝(copyTo方法)拷貝的只是矩陣頭并修改源矩陣的refcounter指針,并不將源矩陣的實際數據拷貝至目的矩陣,故上例目的不能達到。(2)矩陣的拷貝2022/12/28第7頁第16章OpenCV圖像處理【2022/12/29第63頁第16章OpenCV圖像處理【例.3】:新建一個三通道圖像img,并將(10,10,100,100)的矩形區域置為綠色Matimg(Size(320,240),CV_8UC3);Matroi(img,Rect(10,10,100,100));roi=Scalar(0,255,0);【例.4】:利用數組初始化矩陣M,再將矩陣M克隆至矩陣Ndoublem[3][3]={{1,2,3},{4,5,6},{7,8,9}};MatM=Mat(3,3,CV_64F,m);MatN=M.clone();矩陣N的內容將和矩陣M的完全一致,且都獨立分配內存空間。(3)矩陣的克隆【建議使用】2022/12/28第8頁第16章OpenCV圖像處理【2022/12/29第64頁第16章OpenCV圖像處理(4)矩陣的初始化【例.6】:產生“0”/“1”矩陣MatA;A=Mat::zeros(3,3,CV_32F);MatB=Mat::ones(100,100,CV_8U)*3【例.5】:intm[3][3]={{1,2,3},{4,5,6},{7,8,9}};MatM=Mat(3,3,CV_8U,m);2022/12/28第9頁第16章OpenCV圖像處理(2022/12/29第65頁第16章OpenCV圖像處理(5)矩陣的存取【例.7】:at方法MatH(100,100,CV_64F);for(inti=0;i<H.rows;i++)for(intj=0;j<H.cols;j++)H.at<double>(i,j)=255.H.at<double>(i,j);(6)矩陣的運算①點積:要求兩個矩陣(M、N)的大小、類型相同M.dot(N);2022/12/28第10頁第16章OpenCV圖像處理2022/12/29第66頁第16章OpenCV圖像處理②叉積:要求兩個矩陣必須為相同大小、類型的三元組浮點類型M.cross(N);③乘除:multiply(M,N,D,0.8);//點乘divide(M,N,D);//點除M.mul(5/N);//等價于divide(M,N,5);D=M*N;//兩個矩陣相乘④加減add(M,N,D);//D=M+Nsubtract(M,N,D);//D=M.N2022/12/28第11頁第16章OpenCV圖像處理2022/12/29第67頁第16章OpenCV圖像處理⑤求逆N=M.inv();⑥轉置N=M.t();3、Mat結構成員函數OpenCV提供了非常豐富的矩陣操作的API函數,幾乎囊括了所有必需的基本矩陣運算,這些函數包括:絕對值、絕對差、求逆、對數運算、指數運算、模運算、特征值求解、最大(小)值、轉置、歸一化、奇異值分解等等,詳見OpenCV參考手冊。2022/12/28第12頁第16章OpenCV圖像處理2022/12/29第68頁第16章OpenCV圖像處理16.2.1輸入/輸出16.2OpenCV圖像操作1、裝載圖像Mat

imread(conststring&

filename,int

flags=1

);//適用于C++2022/12/28第13頁第16章OpenCV圖像處理2022/12/29第69頁第16章OpenCV圖像處理2、保存圖像bool

imwrite(conststring&

filename,InputArray

image,constvector<int>&

params=vector<int>())2022/12/28第14頁第16章OpenCV圖像處理2022/12/29第70頁第16章OpenCV圖像處理16.2.2圖像存取1、獲取像素值①單通道圖像: Scalarintensity=img.at<uchar>(x,y);②三通道圖像:按B、G、R排列

Vec3bintensity=img.at<Vec3b>(x,y); ucharblue=intensity.val[0]; uchargreen=intensity.val[1]; ucharred=intensity.val[2];

Vec3fintensity=img.at<Vec3f>(x,y); floatblue=intensity.val[0]; floatgreen=intensity.val[1]; floatred=intensity.val[2];2022/12/28第15頁第16章OpenCV圖像處理2022/12/29第71頁第16章OpenCV圖像處理2、修改像素值 img.at<uchar>(x,y)=128;注:<…>中的類型須與圖像數據的實際類型一致。16.2.3底層操作1、賦值 Img=Scalar(0);2、ROI操作 Rectr(10,10,100,100); MatsmallImg=img(r);3、色彩轉換

cvtColor(img,grey,CV_BGR2GRAY);2022/12/28第16頁第16章OpenCV圖像處理2022/12/29第72頁第16章OpenCV圖像處理16.2.4圖像顯示 Matimg=imread("image.jpg");

namedWindow("image",CV_WINDOW_AUTOSIZE);

imshow("image",img);

waitKey();16.2.5圖像處理API1、圖像濾波medianFilter,GaussianFilter,bilateralFilter,blur,boxFilter,filter2D,GaussianBlur,Smooth,medianBlur,Laplacian,Sobel,imdilate,imerode2022/12/28第17頁第16章OpenCV圖像處理2022/12/29第73頁第16章OpenCV圖像處理2、圖像變換invertAffineTransform,warpAffine,warpPerspective,LogPolar,resize,dct,dft,adaptiveThreshold,cvtColor,floodFill,integral,watershed

3、圖像直方圖calcHist,equalizeHist,NormalizeHist,ThreshHist4、結構分析與形狀描述moments,HuMoments,findContours,drawContours,contourArea,ApproxChains,boundingRect,……5、特征檢測Canny,HoughCircles,HoughLines,MatchTemplate6、視頻操作VideoCapture::open,isOpened,release,grab,……VideoWriter::open,isOpened,write2022/12/28第18頁第16章OpenCV圖像處理2022/12/29第74頁第16章OpenCV圖像處理16.3.1控制臺模式16.3OpenCV編程舉例1、基本原理給圖像添加噪聲,實際上就是對圖像中像素點的灰度值進行隨機修改,通過隨機數產生函數取得像素點的行、列坐標,然后對該像素點的灰度值按照事先約定的方式置為0或255的過程;圖像平滑的方式,按照數字圖像處理的理論有多種方式,如均值濾波、中值濾波、高斯平滑濾波等等,這些基本的圖像處理算法在OpenCV中都提供了相應的API函數。本例采用中值濾波進行平滑處理。

2022/12/28第19頁第16章OpenCV圖像處理2022/12/29第75頁第16章OpenCV圖像處理2、程序源碼(1)包含所需的頭文件#include<iostream>//標準輸入/輸出流#include<vector> //矢量//OpenCV圖像處理包 #include"opencv2/imgproc/imgproc.hpp"http://OpenCV高層GUI包 #include"opencv2/highgui/highgui.hpp"http://OpenCV二維特征檢測與描述包 #include"opencv2/features2d/features2d.hpp"(2)聲明命名空間 usingnamespacestd;

//C++標準std命名空間usingnamespacecv; //OpenCV命名空間

2022/12/28第20頁第16章OpenCV圖像處理2022/12/29第76頁第16章OpenCV圖像處理(3)自定義函數原型聲明(可選)voidaddNoise(Mat&image,intn,intnoise);//圖像加噪自定義函數

(4)main函數:主函數intmain(void){//建立三個窗口,分別用于顯示源圖像、加噪后圖像和平滑后的圖像

namedWindow("Source",CV_WINDOW_AUTOSIZE);namedWindow("Noised",CV_WINDOW_AUTOSIZE);namedWindow("Smoothed",CV_WINDOW_AUTOSIZE);//定義圖像容器src,并加載圖像lena.pngMatsrc=imread("lena.png",CV_BGR2GRAY);if(src.empty())return1;//判斷是否加載成功

imshow("Source",src); //顯示源圖像

addNoise(src,2000,255);//給圖像加入隨機噪聲imshow("Noised",src); //顯示加噪后的圖像

medianBlur(src,src,3);//對加噪后的圖像進行中值濾波平滑處理imshow("Smoothed",src); //顯示平滑后的圖像waitKey(); //等待用戶按鍵}

2022/12/28第21頁第16章OpenCV圖像處理2022/12/29第77頁第16章OpenCV圖像處理(5)addNoise函數:用于對圖像添加隨機噪聲//入口參數:image—待添加噪聲的源圖像;n—加入噪聲點個數;noise—噪聲類型//出口參數:無voidaddNoise(Mat&image,intn=1000,intnoise=0){srand(getTickCount()); //產生隨機數種子if(image.empty())return;//判斷源圖像是否有效for(intl=0;l<n;l++){ //循環添加噪聲點inti=rand()%image.rows; //隨機噪聲點行坐標intj=rand()%image.cols; //隨機噪聲點列坐標if(image.channels()>=3){ //圖像通道數判斷for(intk=0;k<image.channels();k++)//多通道image.at<Vec3b>(i,j)[k]=noise;//添加噪聲}else{ //單通道 image.at<uchar>(i,j)=noise;//添加噪聲}}}2022/12/28第22頁第16章OpenCV圖像處理2022/12/29第78頁第16章OpenCV圖像處理2、運行結果

圖16.1加噪后的圖像圖16.2中值濾波平滑后的圖像2022/12/28第23頁第16章OpenCV圖像處理2022/12/29第79頁第16章OpenCV圖像處理16.3.2GUI界面模式按照15.2節的方法,(1)在Code::Blocks中新建工程;(2)工程模板選擇“wxWidgetsProjects”;(3)GUI界面設計器選擇“wxFormbuilder”;(4)應用程序類型選擇“FrameBased”;(5)其余頁面選項可根據實際情況確定,如wxWidgets是以動態鏈接庫還是靜態鏈接庫等等。關鍵步驟如圖16.3和圖16.4所示。

1、新建工程2022/12/28第24頁第16章OpenCV圖像處理2022/12/29第80頁第16章OpenCV圖像處理圖16.3GUI設計器及應用程序類型選擇圖16.4wxWidgets庫設置wxSmith、wxFormbuilder分別是Code::Blocks自帶的設計器插件和為外部GUI設計器。建議初學者使用wxFormbuilder。【UsewxWidgetsDLL】:勾選表示使用DLL方式。【Enableunicode】:勾選表示支持Unicode字符編碼。2022/12/28第25頁第16章OpenCV圖像處理2022/12/29第81頁第16章OpenCV圖像處理2、GUI界面設計本GUI案例采用如表16.4所示的wxWidgets組件來設計完成,GUI界面的外觀如圖16.5所示。組件類功能在本案例中用途wxFrame框架窗口GUI頂層窗口wxMenuBar菜單提供菜單操作wxSizer布局容器提供GUI界面中各組件的布局功能wxStaticLine靜態線條用于GUI界面不同區域的分割線wxStaticText靜態文本用于顯示字符信息wxTextCtrl文本控件用于接收用戶輸入數據wxChoice選項控件提供用戶選擇(噪聲類型、平滑算法)wxButton按鈕執行某種操作(如加噪、平滑濾波)表16.4所用到的wxWidgets組件2022/12/28第26頁第16章OpenCV圖像處理2022/12/29第82頁第16章OpenCV圖像處理圖16.5wxFormbuilder下的GUI界面外觀2022/12/28第27頁第16章OpenCV圖像處理2022/12/29第83頁第16章OpenCV圖像處理(1)菜單處理:本例只為“F文件”菜單中的“O打開”命令項的OnMenuSelection事件添加處理函數“OnFileopen”處理函數,完成打開一個圖像文件的操作。其余菜單項的事件處理采用系統生成的默認操作。(2)命令按鈕:分別為“加噪”、“平滑”兩個按鈕的“OnButtonClick”和“OnUpdateUI”事件添加處理函數:OnBtnAddNoise、OnUpdateUIAddnoise、OnBtnSmooth和OnUpdateUISmooth。3、生成代碼按15.3的方法,點擊工具欄“GenerateCode”按鈕和菜單“Tools\GenerateInheritedClass”生成GUI界面的C++代碼和派生類,并將派生類中事件處理函數的聲明和實現代碼框架拷貝到設計主文件,修改并完善相關代碼。2022/12/28第28頁第16章OpenCV圖像處理2022/12/29第84頁第16章OpenCV圖像處理4、代碼分析本例的源代碼包含三個類和一個資源文件:應用程序類ImageSmoothApp、GUI界面類GUIFrame、resource.rc和ImageSmoothMain。(1)應用程序類ImageSmoothApp類2022/12/28第29頁第16章OpenCV圖像處理2022/12/29第85頁第16章OpenCV圖像處理2022/12/28第30頁第16章OpenCV圖像處理2022/12/29第86頁第16章OpenCV圖像處理(2)設計主文件ImageSmoothFrame類2022/12/28第31頁第16章OpenCV圖像處理2022/12/29第87頁第16章OpenCV

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論