?? conarea.pro
字號(hào):
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;Title: 連通域算法
;;Organization:中國科學(xué)院遙感應(yīng)用研究所
;; :國家航天局航天遙感論證中心
;;Author:李家國
;;CreateData:2008.04.22
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;程序運(yùn)行測試
Pro ConAreaTest
datasTrial = [[0,1,1,1,1,1,5,5,0,1,0,0,0,0], $
[2,1,2,1,0,1,5,5,6,0,6,1,0,0], $
[1,2,0,1,1,5,5,1,5,6,0,0,7,7], $
[1,2,0,0,8,1,5,5,1,6,0,0,7,1]]
;;所有值全部參與計(jì)算
ConArea, datasTrial, otMask
print, otMask
print, '************************'
;;1,5值不參與計(jì)算
backDNs = [1,5]
ConArea, datasTrial, otMask, inBackDNs = backDNs
print, otMask
print, '************************'
;;只計(jì)算2,6值
conDNs = [2, 6]
ConArea, datasTrial, otMask, inConDNs = ConDNs
print, otMask
End
;;計(jì)算某一二維數(shù)組的連通性,最后給出掩碼,對(duì)于孤島情況,掩碼為0
;;inBackDNs:不參與計(jì)算的背景值
;;inConDNs:需要計(jì)算的DN值
;;inBackDNs和inConDNs不可以共存,共存的情況下只取背景值
;;或者兩者都不需要,從而全部計(jì)算
Pro ConArea, inDatas, otMask, inBackDNs = inBackDNs, inConDNs = inConDNs
Common ConProperty, m_ConDatas, m_CurStatus, m_ConIndex
m_ConIndex = 1
m_ConDatas = inDatas
nl_ns = Size(inDatas, /DIMENSIONS)
totalStatus = UlonArr(nl_ns)
m_CurStatus = IntArr(nl_ns)
iBackDNs = N_ELEMENTS(inBackDNs)
iConDNs = N_ELEMENTS(inConDNs)
iDoMasks = IntArr(nl_ns) ;1需要計(jì)算的DN值,0不需要計(jì)算的DN值
;;需要計(jì)算的連通值的掩碼
IF iConDNs NE 0 THEN BEGIN
FOR ii = 0, iConDNs - 1 DO BEGIN
conIndex = Where(inDatas EQ inConDNs[ii], iCount)
IF iCount NE 0 THEN iDoMasks[conIndex] = 1
ENDFOR
ENDIF ELSE IF iBackDNs NE 0 THEN BEGIN
iDoMasks[*, *] = 1
FOR ii = 0, iBackDNs - 1 DO BEGIN
conIndex = Where(inDatas EQ inBackDNs[ii], iCount)
IF iCount NE 0 THEN iDoMasks[conIndex] = 0
ENDFOR
ENDIF ELSE BEGIN
iDoMasks[*, *] = 1
ENDELSE
;;計(jì)算連通性
FOR ii = 0, nl_ns[0] - 1 DO BEGIN
FOR jj = 0, nl_ns[1] - 1 DO BEGIN
IF iDoMasks[ii, jj] EQ 1 THEN BEGIN
IF totalStatus[ii, jj] EQ 0 THEN BEGIN
m_CurStatus[*, *] = 0
ConAreaPoint, ii, jj
;;對(duì)孤島的處理
iIsolative = Where(m_CurStatus NE 0, iCount)
IF iCount EQ 1 THEN BEGIN
m_CurStatus[iIsolative] = 0
m_ConIndex--
ENDIF
;;計(jì)算總的掩碼
totalStatus +=m_CurStatus
m_ConIndex++
ENDIF
ENDIF
ENDFOR
ENDFOR
otMask = totalStatus
;;釋放
m_ConDatas = 0
m_CurStatus = 0
m_ConIndex = 0
End
;;函數(shù)功能:給定位置,計(jì)算當(dāng)前位置點(diǎn)的所有連通點(diǎn)
;;inX:當(dāng)前點(diǎn)的列號(hào)
;;inY:當(dāng)前點(diǎn)的行號(hào)
Pro ConAreaPoint, inX, inY
Common ConProperty, m_ConDatas, m_CurStatus, m_ConIndex
;;得到當(dāng)前值
curDN = m_ConDatas[inX, inY]
m_CurStatus[inX, inY] = m_ConIndex
nl_ns = Size(m_CurStatus, /DIMENSIONS)
;;左遍歷
IF inX GT 0 THEN BEGIN
leftDN = m_ConDatas[inX - 1, inY]
IF leftDN EQ curDN THEN BEGIN
IF m_CurStatus[inX - 1, inY] NE m_ConIndex THEN BEGIN
m_CurStatus[inX - 1, inY] = m_ConIndex
ConAreaPoint, inX - 1, inY
ENDIF
ENDIF
ENDIF
;;右遍歷
IF inX LT nl_ns[0] - 1 THEN BEGIN
rightDN = m_ConDatas[inX + 1, inY]
IF rightDN EQ curDN THEN BEGIN
IF m_CurStatus[inX + 1, inY] NE m_ConIndex THEN BEGIN
m_CurStatus[inX + 1, inY] = m_ConIndex
ConAreaPoint, inX + 1, inY
ENDIF
ENDIF
ENDIF
;;上遍歷
IF inY GT 0 THEN BEGIN
upDN = m_ConDatas[inX, inY - 1]
IF upDN EQ curDN THEN BEGIN
IF m_CurStatus[inX, inY - 1] NE m_ConIndex THEN BEGIN
m_CurStatus[inX, inY - 1] = m_ConIndex
ConAreaPoint, inX, inY - 1
ENDIF
ENDIF
ENDIF
;;下遍歷
IF inY LT nl_ns[1] - 1 THEN BEGIN
downDN = m_ConDatas[inX, inY + 1]
IF downDN EQ curDN THEN BEGIN
IF m_CurStatus[inX, inY + 1] NE m_ConIndex THEN BEGIN
m_CurStatus[inX, inY + 1] = m_ConIndex
ConAreaPoint, inX, inY + 1
ENDIF
ENDIF
ENDIF
;;左上遍歷
IF (inX GT 0) && (inY GT 0) THEN BEGIN
leftUpDN = m_ConDatas[inX - 1, inY - 1]
IF leftUpDN EQ curDN THEN BEGIN
IF m_CurStatus[inX - 1, inY - 1] NE m_ConIndex THEN BEGIN
m_CurStatus[inX - 1, inY - 1] = m_ConIndex
ConAreaPoint, inX - 1, inY - 1
ENDIF
ENDIF
ENDIF
;;右上遍歷
IF (inX LT nl_ns[0] - 1) && (inY GT 0) THEN BEGIN
rightUpDN = m_ConDatas[inX + 1, inY - 1]
IF rightUpDN EQ curDN THEN BEGIN
IF m_CurStatus[inX + 1, inY - 1] NE m_ConIndex THEN BEGIN
m_CurStatus[inX + 1, inY - 1] = m_ConIndex
ConAreaPoint, inX + 1, inY - 1
ENDIF
ENDIF
ENDIF
;;左下遍歷
IF (inX GT 0) && (inY LT nl_ns[1] - 1) THEN BEGIN
leftDownDN = m_ConDatas[inX - 1, inY + 1]
IF leftDownDN EQ curDN THEN BEGIN
IF m_CurStatus[inX - 1, inY + 1] NE m_ConIndex THEN BEGIN
m_CurStatus[inX - 1, inY + 1] = m_ConIndex
ConAreaPoint, inX - 1, inY + 1
ENDIF
ENDIF
ENDIF
;;右下遍歷
IF (inX LT nl_ns[0] - 1) && (inY LT nl_ns[1] - 1) THEN BEGIN
leftDownDN = m_ConDatas[inX + 1, inY + 1]
IF leftDownDN EQ curDN THEN BEGIN
IF m_CurStatus[inX + 1, inY + 1] NE m_ConIndex THEN BEGIN
m_CurStatus[inX + 1, inY + 1] = m_ConIndex
ConAreaPoint, inX + 1, inY + 1
ENDIF
ENDIF
ENDIF
End
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -