forstner算子提取特征点

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Forstner算子提取特征点(原创)

;------------------------------

;Forstner算子

;; image:输入原始图像

; vwsize:窗口宽度

; ithresh:初选差分阈值

; qthresh:兴趣值阈值

function Forstner,image,vwsize=vwsize,ithresh=ithresh,Tq=Tq

IF N_Elements(vwsize) eq 0 THEN vwsize=5

IF N_Elements(ithresh) eq 0 THEN ithresh=50

IF N_Elements(Tq) eq 0 THEN Tq=0.5

image=float(image)

imgSize = Size(image, /Dimensions)

xsize=imgSize[0]

ysize=imgSize[1]

;灰度的协方差矩阵

result=fltarr(xsize,ysize)

;第一步:利用差分算子提取初选点

for i=1,xsize-2 do begin

for j=1,ysize-2 do begin

dg1=abs(image[i,j]-image[i+1,j])

dg2=abs(image[i,j]-image[i,j+1])

dg3=abs(image[i,j]-image[i-1,j])

dg4=abs(image[i,j]-image[i,j-1])

dg=[dg1,dg2,dg3,dg4]

temp=dg[sort(dg)]

if temp[2] gt ithresh then begin

result[i,j]=255

endif else begin

result[i,j]=0

endelse

endfor

endfor

;第二步:在以初选点为中心的3*3的窗口中计算协方差矩阵与圆度

;此处可用where提高循环效率

;权重矩阵

wMatrix=fltarr(xsize,ysize)

for i=1,xsize-2 do begin

for j=1,ysize-2 do begin

;是初选点

if result[i,j] eq 255 then begin

gu2=0.0 & gv2=0.0 & guv=0.0

for ii=-1,1 do begin

for jj=-1,1 do begin

gu2=gu2+(image[i+1,j+1]-image[i,j])^2

gv2=gv2+(image[i,j+1]-image[i+1,j])^2

guv=guv+(image[i+1,j+1]-image[i,j])*(image[i,j+1]-image[i+1,j]) endfor

endfor

DetN=gu2*gv2-guv

trN=gu2+gv2

q=4*DetN/(trN*trN)

;第三步:设定阈值Tq,若满足则计算权值

if q gt Tq then wMatrix[i,j]=DetN/trN

endif

endfor

;第四步:以权值为基础,在一定窗口内抑制局部非最大值候选点;取出局部极大值点

wradius=vwsize/2

for i=wradius,xsize-1-wradius do begin

for j=wradius,ysize-1-wradius do begin

tempiv=wMatrix[i-wradius:i+wradius,j-wradius:j+wradius]

;将区域内像素按从大至小排列

tempsort=tempiv(REVERSE(SORT(tempiv)))

;排除整个区域像素相等的情况

if (wMatrix[i,j] eq tempsort[0]) and (wMatrix[i,j] ne tempsort[1]) then begin

result[i,j]=255

endif else begin

result[i,j]=0

endelse

endfor

endfor

return,result

end

;--------------------

pro Forstner_test

DEVICE, DECOMPOSED=1

; 获取本程序所在文件路径

RootDir = Sourceroot()

; file=RootDir+'\small.bmp'

file=RootDir+'\8bit_house.bmp'

queryStatus = QUERY_IMAGE(file, imgInfo)

if queryStatus eq 0 then begin

Result = DIALOG_MESSAGE('参考图像格式不可识别!',/error,title='警告')

return

endif

if (imgInfo.CHANNELS ne 1) then begin

Result = DIALOG_MESSAGE('图像格式必须为8bit',/error,title='警告')

相关文档
最新文档