阅读:2648回复:2
[原创]使用SUSAN算法提取特征点(IDL)
<P>;-------------------------------------------<BR>;使用SUSAN算法提取边缘或特征点</P>
<P>;-------------------------------------------</P> <P>;参考 章毓晋:图像处理第二版(中册)</P> <P>;image:输入的原始图像<BR>;T:灰度差阈值<BR>;P:面积百分比阈值0-1</P> <P>function Susan,image,T=t,P=p</P> <P><BR>IF N_Elements(T) eq 0 THEN T=25.0<BR>IF N_Elements(P) eq 0 THEN P=0.75<BR>image=float(image)<BR>mask=fltarr(36) ;定义圆形模板</P> <P>imgSize = Size(image, /Dimensions)<BR>xsize=imgSize[0]<BR>ysize=imgSize[1]</P> <P>result=fltarr(xsize,ysize)</P> <P>G=P*36 ;模板共有36个像素</P> <P>for i=3,xsize-4 do begin<BR> for j=3,ysize-4 do begin<BR> s=0<BR> mask[0]=image[i-1,j+3] ; mask[1]=image[i,j+3] ; mask[2]=image[i+1,j+3]<BR> mask[3]=image[i-2,j+2] ; mask[4]=image[i-1,j+2] ; mask[5]=image[i,j+2] ; mask[6]=image[i+1,j+2] ;mask[7]=image[i+2,j+2]<BR> mask[8]=image[i-3,j+1] ; mask[9]=image[i-2,j+1] ; mask[10]=image[i-1,j+1] ; mask[11]=image[i,j+1] ; mask[12]=image[i+1,j+1] ;mask[13]=image[i+2,j+1] ; mask[14]=image[i+3,j+1]<BR> mask[15]=image[i-3,j] ; mask[16]=image[i-2,j] ; mask[17]=image[i-1,j] ; mask[18]=image[i+1,j] ;mask[19]=image[i+2,j] ; mask[20]=image[i+3,j]<BR> mask[21]=image[i-3,j-1] ; mask[22]=image[i-2,j-1] ; mask[23]=image[i-1,j-1] ; mask[24]=image[i,j-1] ; mask[25]=image[i+1,j-1] ;mask[26]=image[i+2,j-1] ; mask[27]=image[i+3,j-1]<BR> mask[28]=image[i-2,j-2] ; mask[29]=image[i-1,j-2] ; mask[30]=image[i,j-2] ; mask[31]=image[i+1,j-2] ;mask[32]=image[i+2,j-2]<BR> mask[33]=image[i-1,j-3] ; mask[34]=image[i,j-3] ; mask[35]=image[i+1,j-3]</P> <P> for k=0,35 do begin<BR> if abs(mask[k]-image[i,j]) lt T then begin<BR> s=s+1<BR> endif<BR> endfor</P> <P> if (s lt G) then begin<BR> result[i,j]=G-s<BR> endif else begin<BR> result[i,j]=0<BR> endelse<BR> endfor</P> <P>endfor</P> <P>return,result</P> <P>;</P> <P><BR>end</P> <P><BR>;--------------------<BR>pro Susan_test<BR>DEVICE, DECOMPOSED=1</P> <P>; 获取本程序所在文件路径<BR>RootDir = Sourceroot()</P> <P>file=RootDir+'\susan_test4.bmp'</P> <P><BR>queryStatus = QUERY_IMAGE(file, imgInfo)<BR>if queryStatus eq 0 then begin<BR> Result = DIALOG_MESSAGE('参考图像格式不可识别!',/error,title='警告')<BR> return<BR>endif</P> <P>if (imgInfo.CHANNELS ne 1) then begin<BR> Result = DIALOG_MESSAGE('图像格式必须为8bit',/error,title='警告')<BR> return<BR>endif</P> <P>imgSize = imgInfo.dimensions<BR>xsize=imgsize[0]<BR>ysize=imgsize[1]<BR>image=READ_IMAGE(file)</P> <P>resultimg=susan(image,t=20,p=0.5)<BR>print,max(resultimg)<BR>index=where(resultimg ge 18.0,count)<BR>print,count</P> <P>dims=size(resultimg,/dimensions)<BR>ncol=dims[0]<BR>col_index=index mod ncol ;列数<BR>row_index=index/ncol ;行数</P> <P>WINDOW, /free, XSIZE = xsize, YSIZE = ysize<BR>TV, image<BR>for i=0,count-1 do begin<BR> PLOTS,[col_index-2,col_index+2],[row_index,row_index],/DEVICE,color='ff0000'xl<BR> PLOTS,[col_index,col_index],[row_index-2,row_index+2],/DEVICE,color='ff0000'xl<BR>endfor<BR>end</P> <P>;*****************************************************8</P> <P>;;更多内容请访问我的个人博客 hi.baidu.com/yzhglory</P> |
|
1楼#
发布于:2008-09-02 10:58
好的,太感谢了!
|
|
2楼#
发布于:2008-09-01 11:26
<P>没有人顶帖?</P>
|
|