《数字图像处理及工程应用》课件第16章_第1页
《数字图像处理及工程应用》课件第16章_第2页
《数字图像处理及工程应用》课件第16章_第3页
《数字图像处理及工程应用》课件第16章_第4页
《数字图像处理及工程应用》课件第16章_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2024/8/21第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"//…cv::MatH=imread(“lena.jpg”);2024/8/21第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位无符号整型2024/8/21第3页第16章OpenCV图像处理2、基础结构注意:其中常用的是类型是Point、Size、Ptr、Rect和Scalar。2024/8/21第4页第16章OpenCV图像处理16.1.3Mat基本图像容器1、Mat结构头2024/8/21第5页第16章OpenCV图像处理2、Mat结构成员函数(1)矩阵的创建方法2024/8/21第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图像处理2024/8/21第7页第16章OpenCV图像处理【例.2】:继上例,欲将矩阵M的第7列拷贝给第1列MatM1=M.col(1);M.col(7).copyTo(M1);注意:矩阵的拷贝(copyTo方法)拷贝的只是矩阵头并修改源矩阵的refcounter指针,并不将源矩阵的实际数据拷贝至目的矩阵,故上例目的不能达到。(2)矩阵的拷贝2024/8/21第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)矩阵的克隆【建议使用】2024/8/21第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);2024/8/21第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);2024/8/21第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.N2024/8/21第12页第16章OpenCV图像处理⑤求逆N=M.inv();⑥转置N=M.t();3、Mat结构成员函数OpenCV提供了非常丰富的矩阵操作的API函数,几乎囊括了所有必需的基本矩阵运算,这些函数包括:绝对值、绝对差、求逆、对数运算、指数运算、模运算、特征值求解、最大(小)值、转置、归一化、奇异值分解等等,详见OpenCV参考手册。2024/8/21第13页第16章OpenCV图像处理16.2.1

输入/输出16.2OpenCV图像操作1、装载图像Mat

imread(conststring&

filename,int

flags=1

);//适用于C++2024/8/21第14页第16章OpenCV图像处理2、保存图像bool

imwrite(conststring&

filename,InputArray

image,constvector<int>&

params=vector<int>())2024/8/21第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];2024/8/21第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);2024/8/21第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,imerode2024/8/21第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,write2024/8/21第19页第16章OpenCV图像处理16.3.1

控制台模式16.3

OpenCV编程举例1、基本原理给图像添加噪声,实际上就是对图像中像素点的灰度值进行随机修改,通过随机数产生函数取得像素点的行、列坐标,然后对该像素点的灰度值按照事先约定的方式置为0或255的过程;图像平滑的方式,按照数字图像处理的理论有多种方式,如均值滤波、中值滤波、高斯平滑滤波等等,这些基本的图像处理算法在OpenCV中都提供了相应的API函数。本例采用中值滤波进行平滑处理。

2024/8/21第20页第16章OpenCV图像处理2、程序源码(1)包含所需的头文件#include<iostream>//标准输入/输出流#include<vector> //矢量//OpenCV图像处理包 #include"opencv2/imgproc/imgproc.hpp"//OpenCV高层GUI包 #include"opencv2/highgui/highgui.hpp"//OpenCV二维特征检测与描述包 #include"opencv2/features2d/features2d.hpp"(2)声明命名空间 usingnamespacestd;

//C++标准std命名空间usingnamespacecv; //OpenCV命名空间

2024/8/21第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(); //等待用户按键}

2024/8/21第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;//添加噪声}}}2024/8/21第23页第16章OpenCV图像处理2、运行结果

图16.1加噪后的图像图16.2中值滤波平滑后的图像2024/8/21第24页第16章OpenCV图像处理16.3.2

GUI界面模式按照15.2节的方法,(1)在Code::Blocks中新建工程;(2)工程模板选择“wxWidgetsProjects”;(3)GUI界面设计器选择“wxFormbuilder”;(4)应用程序类型选择“FrameBased”;(5)其余页面选项可根据实际情况确定,如wxWidgets是以动态链接库还是静态链接库等等。关键步骤如图16.3和图16.4所示。

1、新建工程2024/8/21第25页第16章OpenCV图像处理图16.3GUI设计器及应用程序类型选择图16.4wxWidgets库设置wxSmith、wxFormbuilder分别是Code::Blocks自带的设计器插件和为外部GUI设计器。建议初学者使用wxFormbuilder。【UsewxWidgetsDLL】:勾选表示使用DLL方式。【Enableunicode】:勾选表示支持Unicode字符编码。2024/8/21第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组件2024/8/21第27页第16章OpenCV图像处理图16.5wxFormbuilder下的GUI界面外观2024/8/21第28页第16章OpenCV图像处理(1)菜单处理:本例只为“F文件”菜单中的“O打开”命令项的OnMenuSelection事件添加处理函数“OnFileopen”处理函数,完成打开一个图像文件的操作。其余菜单项的事件处理采用系统生成的默认操作。(2)命令按钮:分别为“加噪”、“平滑”两个按钮的“OnButtonClick”和“OnUpdateUI”事件添加处理函数:OnBtnAddNoise、OnUpdateUIAddnoise、OnBtnSmooth和OnUpdateUISmooth。3、生成代码按15.3的方法,点击工具栏“GenerateCode”按钮和菜单“Tools\GenerateInheritedClass”生成GUI界面的C++代码和派生类,并将派生类中事件处理函数的声明和实现代码框架拷贝到设计主文件,修改并完善相关代码。2024/8/21第29页第16章OpenCV图像处理4、代码分析本例的源代码包含三个类和一个资源文件:应用程序类ImageSmoothApp、GUI界面类GUIFrame、resource.rc和ImageSmoothMain。(1)应用程序类ImageSmoothApp类2024/8/21第30页第16章OpenCV图像处理2024/8/21第31页第16章OpenCV图像处理(2)设计主文件ImageSmoothFrame类2024/8/21第32页第16章OpenCV图像处理2024/8/21第33页第16章OpenCV图像处理2024/8/21第34页第16章OpenCV图像处理2024/8/21第35页第16章OpenCV图像处理2024/8/21第36页第16章OpenCV图像处理2024/8/21第37页第16章OpenCV图像处理2024/8/21第38页第16章OpenCV图像处理2024/8/21第39页第16章OpenCV图像处理2024/8/21第40页第16章OpenCV图像处理2024/8/21第41页第16章OpenCV图像处理2024/8/21第42页第16章OpenCV图像处理2024/8/21第43页第16章OpenCV图像处理2024/8/21第44页第16章OpenCV图像处理2024/8/21第45页第16章OpenCV图像处理(3)GUIFrame类GUIFrame是wxFormbuilder根据用户GUI设计的布局自动生成的代码,并作为类ImageSmoothFrame的父类加以继承。关于GUIFram

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论