边缘提取.docx
《边缘提取.docx》由会员分享,可在线阅读,更多相关《边缘提取.docx(8页珍藏版)》请在冰豆网上搜索。
边缘提取
数字图像处理报告
学院:
信息科学与电气工程
班级:
学生姓名:
学号:
指导老师:
张广渊
提交日期:
2014.05.05
课程实验报告
实验题目:
_____边缘提取______
姓名:
______学号:
______
班级:
____指导教师:
____张广渊____
实验概述
【实验目的及要求】
本次试验的目的为图像的边缘提取。
【实验原理】
通过VC++连接openCV显示图像。
因为边缘和轮廓都位于灰度突变的地方。
所以锐化算法的实现是基于微分作用。
就是加强图像中景物的细节边缘和轮廓,使灰度反差增强。
【实验环境】
安装openCV
首先,将E:
\OpenCV\bin加入到环境变量PATH
然后,配置VC++环境
菜单Tools->Options->Directories:
选择includefiles,sourcefiles
Libraryfiles,在下方填入路径
建立新工程后,在工程设置里添加路径cxcore.libcv.libml.libcvaux.libhighgui.libcvcam.lib
实验内容
【实验过程】(实验步骤、记录、数据、分析)
视频边缘提取代码如下
/*
程序名称:
laplace.c
功能:
从摄像头或者AVI文件中得到视频流,对视频流进行边缘检测,并输出结果。
*/
#include"cv.h"
#include"highgui.h"
#include
#include
intmain(intargc,char**argv)
{
IplImage*laplace=0;
IplImage*colorlaplace=0;
IplImage*planes[3]={0,0,0};//多个图像面
CvCapture*capture=0;
//下面的语句说明在命令行执行程序时,如果指定AVI文件,那么处理从
//AVI文件读取的视频流,如果不指定输入变量,那么处理从摄像头获取
//的视频流
if(argc==1||(argc==2&&strlen(argv[1])==1&&isdigit(argv[1][0])))
capture=cvCaptureFromCAM(argc==2?
argv[1][0]-'0':
0);
elseif(argc==2)
capture=cvCaptureFromAVI(argv[1]);
if(!
capture)
{
fprintf(stderr,"Couldnotinitializecapturing...\n");
return-1;
}
cvNamedWindow("Laplacian",0);
//循环捕捉,直到用户按键跳出循环体
for(;;)
{
IplImage*frame=0;
inti;
frame=cvQueryFrame(capture);
if(!
frame)
break;
if(!
laplace)
{
for(i=0;i<3;i++)
planes[i]=cvCreateImage(cvSize(frame->width,frame->height),8,1);
laplace=cvCreateImage(cvSize(frame->width,frame->height),
IPL_DEPTH_16S,1);
colorlaplace=cvCreateImage(cvSize(frame->width,frame->height),8,3);
}
cvCvtPixToPlane(frame,planes[0],planes[1],planes[2],0);
for(i=0;i<3;i++)
{
cvLaplace(planes[i],laplace,3);//3:
aperture_size
cvConvertScaleAbs(laplace,planes[i],1,0);//planes[]=ABS(laplace)
}
cvCvtPlaneToPix(planes[0],planes[1],planes[2],0,colorlaplace);
colorlaplace->origin=frame->origin;
cvShowImage("Laplacian",colorlaplace);
if(cvWaitKey(10)>=0)
break;
}
cvReleaseCapture(&capture);
cvDestroyWindow("Laplacian");
return0;
}
Canny获取边缘的代码:
#include"cv.h"
#include"highgui.h"
charwndname[]="Edge";
chartbarname[]="Threshold";
intedge_thresh=1;
IplImage*image=0,*cedge=0,*gray=0,*edge=0;
//定义跟踪条的callback函数
voidon_trackbar(inth)
{
cvSmooth(gray,edge,CV_BLUR,3,3,0);
cvNot(gray,edge);
//对灰度图像进行边缘检测
cvCanny(gray,edge,(float)edge_thresh,(float)edge_thresh*3,3);
cvZero(cedge);
//copyedgepoints
cvCopy(image,cedge,edge);
//显示图像
cvShowImage(wndname,cedge);
}
intmain(intargc,char**argv)
{
char*filename=argc==2?
argv[1]:
(char*)"fruits.jpg";
if((image=cvLoadImage(filename,1))==0)
return-1;
//Createtheoutputimage
cedge=cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U,3);
//将彩色图像转换为灰度图像
gray=cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U,1);
edge=cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U,1);
cvCvtColor(image,gray,CV_BGR2GRAY);
//Createawindow
cvNamedWindow(wndname,1);
//createatoolbar
cvCreateTrackbar(tbarname,wndname,&edge_thresh,100,on_trackbar);
//Showtheimage
on_trackbar(0);
//Waitforakeystroke;thesamefunctionarrangeseventsprocessing
cvWaitKey(0);
cvReleaseImage(&image);
cvReleaseImage(&gray);
cvReleaseImage(&edge);
cvDestroyWindow(wndname);
return0;
}
实验结果:
视频边缘提取结果如图:
Canny获取边缘如图:
小结
通过本次试验,我学会了边缘提取原理。
通过这个原理实践了对视频和图像的边缘提取。
对于代码还是没有完全看懂。
但边缘提取的原理已经明白了。
还需要根据老师的讲解理解一下代码。
指导教师评语及成绩
评语:
成绩:
指导教师签名:
批阅日期: