SUSAN算子特征点检测实验报告

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

机器视觉实验(3)一、实验介绍特征点:即图像的极值点、线段的端点、曲线曲率最大点,是图像的重要特征,对图像处理与分析具有重要作用。特征点保留了图像的重要特征,可以代替图像的处理,有效减少数据量,提高处理速度。特征点检测:从图像中检测和提取特征点的过程和算法。检测方法有基于梯度的检测方法,基于模板的检测方法,基于梯度和模板的检测方法。比较常用的算子有SUSAN、Harris、Moravec、Foerstner、FAST、SIFT等角点检测算子。二、实验内容1、SUSAN算子SUSAN算子是牛津大学的smith教授提出的,只使用一个圆形模板来计算各向同性的响应,既可检测目标边缘点,又能检测图像中的角点,且具有较强的鲁棒性。(1)基本思想SUSAN准则的原理如图所示,用一个圆形模板遍历图像,若模板内其他任意像素的灰度值与模板中心像素(核)的灰度值的差小于一定阈值,就认为该点与核具有相同(或相近)的灰度值,满足这样条件的像素组成的区域称为核值相似区(UnivalueSegmentAssimilatingNucleus,USAN)。把图像中的每个像素与具有相近灰度值的局部区域相联系是SUSAN准则的基础。(2)基本步骤第一步:选择圆形模板,计算相似度。a、圆形模板如图所示,共37个像素。b、相似度第二步:确定USAN区域。第三步:阈值化得到初步的边缘响应。G的取值为USAN最大值的1/2。USAN值越小,角点的响应就越强。第四步:可选择性进行非极大值抑制,角点特征就得到全部增强。2、实验程序BOOLCBmpProcessView::Susan(LPSTRlpDIBBits,LONGlWidth,LONGlHeight){//指向源图像的指针LPSTRlpSrc;//指向缓存图像的指针LPSTRlpDst;//指向缓存DIB图像的指针LPSTRlpNewDIBBits;HLOCALhNewDIBBits;0000001(,)(,)(,;,)0(,)(,)fxyfxyTCxyxyfxyfxyT0000(,)(,)(,)(,;,)xyMxySxyCxyxy000000(,)(,)(,)0elseGSxySxyGRxy//循环变量longi;longj;//像素值intx,r,n=0;unsignedcharpixel[37];//暂时分配内存,以保存新图像hNewDIBBits=LocalAlloc(LHND,lWidth*lHeight);if(hNewDIBBits==NULL){//分配内存失败returnFALSE;}//锁定内存lpNewDIBBits=(char*)LocalLock(hNewDIBBits);//初始化新分配的内存,设定初始值为255lpDst=(char*)lpNewDIBBits;memset(lpDst,(BYTE)255,lWidth*lHeight);POINTpointxy;//定义一个POINT型数据corner.clear();//使用水平方向的结构元素进行腐蚀for(j=lHeight-3;j=2;j--){for(i=2;ilWidth-2;i++){//指向源图像第j行,第i个象素的指针lpSrc=(char*)lpDIBBits+lWidth*j+i;//指向目标图像第j行,第i个象素的指针lpDst=(char*)lpNewDIBBits+lWidth*j+i;//取得当前指针处7*7区域的像素值,注意要转换为unsignedchar型pixel[0]=(unsignedchar)*(lpSrc-3*lWidth-1);pixel[1]=(unsignedchar)*(lpSrc-3*lWidth);pixel[2]=(unsignedchar)*(lpSrc-3*lWidth+1);pixel[3]=(unsignedchar)*(lpSrc-2*lWidth+2);pixel[4]=(unsignedchar)*(lpSrc-lWidth+3);pixel[5]=(unsignedchar)*(lpSrc+3);pixel[6]=(unsignedchar)*(lpSrc+lWidth+3);pixel[7]=(unsignedchar)*(lpSrc+2*lWidth+2);pixel[8]=(unsignedchar)*(lpSrc+3*lWidth+1);pixel[9]=(unsignedchar)*(lpSrc+3*lWidth);pixel[10]=(unsignedchar)*(lpSrc+3*lWidth-1);pixel[11]=(unsignedchar)*(lpSrc+2*lWidth-2);pixel[12]=(unsignedchar)*(lpSrc+lWidth-3);pixel[13]=(unsignedchar)*(lpSrc-3);pixel[14]=(unsignedchar)*(lpSrc-lWidth-3);pixel[15]=(unsignedchar)*(lpSrc-2*lWidth-2);pixel[16]=(unsignedchar)*(lpSrc-2*lWidth-1);pixel[17]=(unsignedchar)*(lpSrc-2*lWidth);pixel[18]=(unsignedchar)*(lpSrc-2*lWidth+1);pixel[19]=(unsignedchar)*(lpSrc-lWidth+2);pixel[20]=(unsignedchar)*(lpSrc+2);pixel[21]=(unsignedchar)*(lpSrc+lWidth+2);pixel[22]=(unsignedchar)*(lpSrc+2*lWidth+1);pixel[23]=(unsignedchar)*(lpSrc+2*lWidth);pixel[24]=(unsignedchar)*(lpSrc+2*lWidth-1);pixel[25]=(unsignedchar)*(lpSrc+lWidth-2);pixel[26]=(unsignedchar)*(lpSrc-2);pixel[27]=(unsignedchar)*(lpSrc-lWidth-2);pixel[28]=(unsignedchar)*(lpSrc-lWidth-1);pixel[29]=(unsignedchar)*(lpSrc-lWidth);pixel[30]=(unsignedchar)*(lpSrc-lWidth+1);pixel[31]=(unsignedchar)*(lpSrc+1);pixel[32]=(unsignedchar)*(lpSrc+lWidth+1);pixel[33]=(unsignedchar)*(lpSrc+lWidth);pixel[34]=(unsignedchar)*(lpSrc+lWidth-1);pixel[35]=(unsignedchar)*(lpSrc-1);pixel[36]=(unsignedchar)*lpSrc;n=0;for(x=0;x37;x++){if(abs(pixel[36]-pixel[x])=30)//可根据实际情况确定阈值n++;}r=0;if(n18){r=18-n;pointxy.x=i;pointxy.y=lHeight-1-j;//记录检测出的角点行,列corner.push_back(pointxy);}}}//返回returnTRUE;}voidCBmpProcessView::OnDraw(CDC*pDC){//显示等待光标BeginWaitCursor();//获取文档CBmpProcessDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);//获取DIBHDIBhDIB=pDoc-GetHDIB();//判断DIB是否为空if(hDIB!=NULL){LPSTRlpDIB=(LPSTR)::GlobalLock((HGLOBAL)hDIB);//获取DIB宽度intcxDIB=(int)::DIBWidth(lpDIB);//获取DIB高度intcyDIB=(int)::DIBHeight(lpDIB);::GlobalUnlock((HGLOBAL)hDIB);CRectrcDIB;rcDIB.top=rcDIB.left=0;rcDIB.right=cxDIB;rcDIB.bottom=cyDIB;CRectrcDest;//判断是否是打印if(pDC-IsPrinting()){//是打印,计算输出图像的位置和大小,以便符合页面//获取打印页面的水平宽度(象素)intcxPage=pDC-GetDeviceCaps(HORZRES);//获取打印页面的垂直高度(象素)intcyPage=pDC-GetDeviceCaps(VERTRES);//获取打印机每英寸象素数intcxInch=pDC-GetDeviceCaps(LOGPIXELSX);intcyInch=pDC-GetDeviceCaps(LOGPIXELSY);//计算打印图像大小(缩放,根据页面宽度调整图像大小)rcDest.top=rcDest.left=0;rcDest.bottom=(int)(((double)cyDIB*cxPage*cyInch)/((double)cxDIB*cxInch));rcDest.right=cxPage;//计算打印图像位置(垂直居中)inttemp=cyPage-(rcDest.bottom-rcDest.top);rcDest.bottom+=temp/2;rcDest.top+=temp/2;}else{//不必缩放图像rcDest=rcDIB;}//输出DIB::PaintDIB(pDC-m_hDC,&rcDest,pDoc-GetHDIB(),&rcDIB,pDoc-GetDocPalette());}//恢复正常光标CPen*ppen=newCPen;ppen-CreatePen(PS_SOLID,1,RGB(255,0,0));pDC-SelectObject(ppen);for(inti=0;icorner.size();i++){pDC-MoveTo(corner[i].x-3,corner[i].y);pDC-LineTo(corner[i].x+3,corner[i].y);pDC-MoveTo(corner[i].x,corner[i].y-3);pDC-LineTo(corner[i].x,corner[i].y+3);}ppen-DeleteObject();//恢复正常光标EndWaitCursor();}//在检测出的角点出画红十字(3)实验结果三、实验总结本次实验是对图像特征点的一个检测。边缘检测与特征点检测都是比较常用的图像处理过程,边缘检测是将图像的整体轮廓展现出来。而特征点检测则将图像的拐点标记出来。因此特征点检测更能清楚的反应图像的一些主要特征,以便对图像进行后续的处理。

1 / 10
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功