求取影像对象的主要方向和长短轴长度

  在面向对象的影像信息提取中,影像对象特征属性的计算是其中重要的一环。面积、周长、紧凑度、波段最小值以及波段标准差等都比较好计算,可以直接调用相应的函数。但是,形状特征类里面的几个重要的特征,如主方向、最大直径、延伸度(最大直径与最小直径之比),没有直接可以利用的函数,计算有难度。这就需要自己动手实现了,这几个特征中最重要的是主方向、最大直径和最小直径三个特征,也是本文的计算目标。下面就是作者编写的IDL程序,包含三个步骤:
1. 计算影像对象内所有像素坐标对的协方差;
2. 计算协方差矩阵的特征值和特征向量,其中最大特征值对应的特征向量就是主方向;
3. 计算最大直径、最小直径和主方向。

1 cov=imsl_covariances(observations)
2 PRINT,'Covariances:'
3 print,cov
4 eval = HQR(ELMHES(cov), /DOUBLE)
5 eval=[max(eval),min(eval)]
6 PRINT, 'Eigenvalues: '
7 print,eval
8 eiv=eigenvec(cov,eval)
9
10 ; EigenVector1为主方向,即(real_part(eiv))[*,0]代表了点集合的主方向
11 ; 这是一个1行2列的数组,第一个元素是以向左为正向的横向X轴坐标,
12 ; 第二个是以向下为正向的纵向y轴坐标
13 print,'EigenVector1:',(real_part(eiv))[*,0]
14 print,'EigenVector2:',(real_part(eiv))[*,1]
15
16 nObservation = (size(observations))[1]
17 majCoord=(real_part(eiv))[*,0]##observations[0,*]
18 mnoCoord=(real_part(eiv))[*,1]##observations[0,*]
19 for j=1,nObservation-1 do begin
20 majCoord=[majCoord,(real_part(eiv))[*,0]##observations[j,*]]
21 mnoCoord=[mnoCoord,(real_part(eiv))[*,1]##observations[j,*]]
22 endfor
23
24 ; 在计算与正向X轴之间的角度(南北是90°,东西是0°或者180°)时,首先判断是在一三象限还是在二四象限。
25 if (real_part(eiv))[0,0]*(real_part(eiv))[1,0] ge 0 then begin
26 mainAngle = 180-180/!PI*acos(abs((real_part(eiv))[0,0]))
27 endif else begin
28 mainAngle = 180/!PI*acos(abs((real_part(eiv))[0,0]))
29 endelse
30
31 print,'Main Angle:', mainAngle
32 print,'Majority Axis:',max(majCoord)-min(majCoord)
33 print,'Minority Axis:',max(mnoCoord)-min(mnoCoord)
34
35 result[0,i]=mainAngle
36 result[1,i]=max(majCoord)-min(majCoord)
37 result[2,i]=max(mnoCoord)-min(mnoCoord)
38 print,result

posted on 2011-11-14 21:07  Jazzy.L  阅读(545)  评论(0)    收藏  举报