C PROGRAM BFOLLOW.FT C ---------------- C C C C ###SUBROUTINE BFOLLOW(JX,JY,IOPR) C C PETER LEMKIN C IMAGE PROCESSING UNIT, DCBD C NATIONAL CANCER INSTITUTE C NATIONAL INSTITUTES OF HEALTH C 9000 ROCKVILLE PIKE C BETHESDA, MD. 20014 C C NOV 15, 1977 C NOV 14, 1977 C NOV 11, 1977 C JUNE 10, 1977 C MAY 14, 1977 C MAY 13, 1977 C MARCH 28, 1977 C MARCH 17, 1977 C FEB 26, 1977 C NOV 15, 1976 C NOV 10, 1976 C NOV 4, 1976 C C PURPOSE C ------- C BFOLLOW FOLLOWSTHE CURVE SPECIFIED BY (IX,IY) WHEN IT C IS INITIALIZED BY OPR #1,#2. SUCCESSIVE CALLS RETURN C NEW CURVE POINTS UNTIL THE INITIAL POINT IS LOCATED C IN WHICH CASE (-1,TRUE PERIMETER) IS RETURNED IN (IX,IY). C C NOTE: (MEM,IBYTE,IX,IY,IZ) IN COMMON ARE SAVED C ON ENTRY AND RESTORED ON THE RETURN. C C IOPR FUNCTION C ---- -------- C 1 DEFINE THE BM (MEM,IBYTE) TO SEARCH FROM (JX,JY). C C 2 DEFINE THE CONNECTED COMPONENT COLOR TO SEARCH FOR C IN JX. C C 3 START NEW BOUNDARY FOLLOWING STARTING AT C POINT (IX,IY) ==>(IXFIRST,IYFIRST). C C 4 GET NEXT (IX,IY) POINT ON BOUNDARY. RETURN C (IX,IY) IF VALID NEXT POINT, CHAIN CODE DIRECTION ==>MQ C (-1,TRUE PERIMETER) IF REACHED THE INITIAL (IXFIRST,IYFIRST), C (-2,0) IF ISOLATED PIXEL, C (-3,0) IF COMPONENT GOT LOST. C OPDEFS C ------ S OPDEF TADI 1400 S OPDEF DCAI 3400 C C S OPDEF DISP1 6435 S OPDEF DISP2 6436 C C S OPDEF MUY 7405 S OPDEF DVI 7407 C S OPDEF MQA 7501 S OPDEF MQL 7421 S OPDEF BSW 7002 C C C [0] DISPATCH S DUMMY JX S DUMMY JY S DUMMY IOPR S ENTRY BFOLL C S CPAGE 10 S JX, BLOCK 2 S JY, BLOCK 2 S IOPR, BLOCK 2 C S BFOLL, BLOCK 2 C C GET THE ARGS S TAD I BFOLL S DCA JX S INC BFOLL# S TAD I BFOLL S DCA JX# S INC BFOLL# C S TAD I JX S DCA \JX C S TAD I BFOLL S DCA JY S INC BFOLL# S TAD I BFOLL S DCA JY# S INC BFOLL# C S TAD I JY S DCA \JY C S TAD I BFOLL S DCA IOPR S INC BFOLL# S TAD I BFOLL S DCA IOPR# S INC BFOLL# C S TAD I IOPR S DCA \IOPR C C J=0 K=0 C C C DISPATCH GOTO (1,2,3,4), IOPR C C [0.1] RETURN 2047 CONTINUE S RETRN BFOLL C [1] INIT THE (KMEM,KBYTE) 1 KMEM=JX KBYTE=JY C C RESET THE PERIMETER COUNTERS IPERIMETER=0 ISQPERIMETER=0 GOTO 2047 C [2] INIT THE FOLLOW SEGMENT COUNTER 2 CONTINUE NC=JY C GOTO 2047 C [3] INIT THE FIRST (X,Y)<==(JX,JY) 3 CONTINUE C C IXFIRST=JX IYFIRST=JY LSTX=JX LSTY=JY ITHETA=45 GOTO 2047 C C C C [4] FOLLOW THE OUTSIDE BORDER 1 POINT. 4 CONTINUE C C C [4.1] GET NEIGHBORHOOD IX=LSTX IY=LSTY C C C GET NEIGHBORHOOD MEM=KMEM IBYTE=KBYTE C C DO FRESH NEIGHBORHOOD FETCH CALL GETI1 C***********DEBUG***** S 6344 /FBW4 S AND (0100 S SNA CLA S JMP \1997 WRITE(3,1996)MEM,IBYTE,IX,IY 1,I13,I12,I11,I14,I18,I10,I15,I16,I17 1996 FORMAT(' BFLW (BM,BY,X,Y)=',4I5,3(/,' ',3I4)) 1997 CONTINUE C****************************** C C [4.2] TEST IF ISOLATED PIXEL C THEN RETURN (-2,-2)==>(JXJY) IF(I10+I11+I12+I13+I14+I15+I16+I17)910,902,910 902 CONTINUE C JX=-2 JY=0 S TAD \JX S DCA I JX S TAD \JY S DCA I \JY GOTO 2047 C C C [4.3] FIND THE MINIMUM COMPUTING WINDOW 910 NUMBERTIMESAROUND=0 C C C [4.4] DISPATCH ACCORDING TO ANGLE IN DEGREES 900 CONTINUE S TAD \ITHETA S MQL S CPAGE 2 S DVI S 55 /45 DECIMAL S CLA C C 0:315==>1:9 S MQA S IAC /+1 S DCA \IVAL C C GOTO(1000,1045,1090,1135,1180,1225,1270,1315),IVAL C C C C C [4.5.1.45] 1045 IF(I11-1)1000,645,745 745 IF(I11-NC)1000,845,1000 C BEGIN "45 DEGREES" 645 ISQPERIMETER=ISQPERIMETER+1 845 IY=IY-1 IX=IX+1 JTHETA=1 ITHETA=180 GOTO 207 C END "45" C C C [4.5.1.0] 1000 IF(I10-1)1315,600,700 700 IF(I10-NC)1315,800,1315 C BEGIN "00 DEGREES" 600 IPERIMETER=IPERIMETER+1 800 IX=IX+1 JTHETA=0 ITHETA=90 GOTO 207 C END "00" C C C [4.5.1.315] 1315 IF(I17-1)1270,631,731 731 IF(I17-NC)1270,831,1270 C BEGIN "315 DEGREES" 631 ISQPERIMETER=ISQPERIMETER+1 831 IY=IY+1 IX=IX+1 JTHETA=7 ITHETA=90 GOTO 207 C END "315" C C C [4.5.1.270] 1270 IF(I16-1)1225,627,727 727 IF(I16-NC)1225,827,1225 C BEGIN "270 DEGREES" 627 IPERIMETER=IPERIMETER+1 827 IY=IY+1 JTHETA=6 ITHETA=0 GOTO 207 C END "270" C C C [4.5.1.225] 1225 IF(I15-1)1180,622,722 722 IF(I15-NC)1180,822,1180 C BEGIN "225 DEGREES" 622 ISQPERIMETER=ISQPERIMETER+1 822 IY=IY+1 IX=IX-1 JTHETA=5 ITHETA=0 GOTO 207 C END "225" C C C [4.5.1.180] 1180 IF(I14-1)1135,618,718 718 IF(I14-NC)1135,818,1135 C BEGIN "180 DEGREES" 618 IPERIMETER=IPERIMETER+1 818 IX=IX-1 JTHETA=4 ITHETA=270 GOTO 207 C END "180" C C C C [4.5.1.135] 1135 IF(I13-1)1090,613,713 713 IF(I13-NC)1090,813,1090 C BEGIN "135 DEGREES" 613 ISQPERIMETER=ISQPERIMETER+1 813 IY=IY-1 IX=IX-1 JTHETA=3 ITHETA=270 GOTO 207 C END "135" C C C C [4.5.1.90] 1090 IF(I12-1)209,690,790 790 IF(I12-NC)209,890,209 C BEGIN "90 DEGREES" 690 IPERIMETER=IPERIMETER+1 890 IY=IY-1 JTHETA=2 ITHETA=180 GOTO 207 C END "90" C C C C C C C [4.6] TEST IF WENT AROUND TWICE C THEN FAIL C ELSE GOTO [4.5.45] 209 NUMBEROFTIMESAROUND=NUMBEROFTIMESAROUND+1 S TAD (-2 S TAD \NUMBERTIMESAROUND S SPA CLA S JMP \1045 /NOT YET C C C [4.6.1] GOT LOST CONTINUE ANYWAYS JX=-3 JY=0 S TAD \JX S DCA I JX S TAD \JY S DCA I JY GOTO 2047 C C C [4.6.2] FOUND (IX,IY) TEST IF DONE. 207 CONTINUE C RETURN JTHETA IN THE MQ S TAD \JTHETA S MQL C@C***********DEBUG***** C@S 6344 /FBW4 C@S AND (0040 /BIT 6 C@S SNA CLA C@S JMP \1999 C@ JTHETA=JTHETA*45 C@ WRITE(3,1998)JTHETA,IX,IY,ITHETA C@1998 FORMAT(' BFOLLOW[4.6.2] MOVED THETA=',I4,',[IX:IY]=[',I3,':', C@ 1I3,'], NEW THETA=',I4) C@1999 CONTINUE C@C************************* C C SAVE LAST XY LSTX=IX LSTY=IY C C PASS BACK (X,Y) AND TEST IF DONE JX=IX JY=IY S TAD \JX S DCA I JX S TAD \JY S DCA I JY C S TAD \IX S CIA S TAD \IXFIRST S SZA CLA S JMP \2047 /NO C S TAD \IY S CIA S TAD \IYFIRST S SZA CLA S JMP \2047 /NO C C C [4.7] YES, DONE WITH FSM CLOSE OUT THE SEGMENT JX=-1 JY=IPERIMETER+IFIX(1.41412*FLOAT(ISQPERIMETER)) S TAD \JX S DCA I JX S TAD \JY S DCA I JY GOTO 2047 C POINTERS C -------- C C C C END