C PROGRAM BNDCORNER.FT C ---------------- C C SUBROUTINE BNDCORNER(KX,KY,ITFLAG,AVC,AVD) 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 JULY 25, 1977 C JULY 18, 1977 C JULY 16, 1977 C JULY 15, 1977 C JULY 14, 1977 C JULY 13, 1977 C JULY 12, 1977 C C INTRODUCTION C ------------ C BNDCORNER COMPUTES THE CORNERITY OF THE CHAIN CODE C DIFFERENCES AND THEN WRITES ON (MEM,IBYTE) IF C THE CORNERITY IS > THE THRESHOLD. C C ARGUMENTS C --------- C KX (IF KX GEQ 0 THEN MEM_KX, ILSW_1 ELSE ILSE_0) - X COORDIATE C KY (IBYTE) - Y COORDINATE C ITFLAG (ICSW) - /D AND (THLOW LEQ AVD LEQ THHIGH) C AVC (IF > 0 THEN ENTERING DATA C ELSE ENTERING DATA) C AVD (FIX(CORNERITY) THRESHOLD) - AVERAGE DIFFERENCE C OPDEFS C ------ S OPDEF TADI 1400 S OPDEF ISZI 2400 S OPDEF DCAI 3400 C C S OPDEF MQA 7501 S OPDEF MQL 7421 S OPDEF KRS 6034 S OPDEF BSW 7002 C C S OPDEF LDXP 6443 S OPDEF LDYP 6444 C S OPDEF DISP1 6435 S OPDEF DISP2 6436 C C C C [1] DETERMINE IF INIT S TAD I \AVC /IF IT IS < 0 THEN INIT S SMA CLA S JMP \200 /NOT INIT MEM=KX S TAD \MEM S SMA CLA S IAC /SET /L SWITCH S DCA \ILSW C IBYTE=KY ICSW=ITFLAG C C GET INTEGER FROM F.P ARG ITHCORN=0 S TAD I \AVD S DCA \ITHCORN IXFIRST=0 IYFIRST=0 IXLAST=0 IYLAST=0 IOLD=0 KMAX=0 IFIRST=0 L0AVD=-1 C C ZERO THE SEGMENT AVD ACCUMULATIONS TOTAVD=0.0 T1AVD=0.0 T2AVD=0.0 EXTAVD=0.0 C C ZERO THE T1, T2 ANGLES ADJACENT TO EXTREMUM SEGMENT T1ANGLE=0.0 T2ANGLE=0.0 C INIT THE STATISTICS STACK CALL BNDCSTAT(ILSW,MEM,IBYTE,0,0,0,0,0,0,1) C C ZERO THE BOUNDARY POINT INDEX COUNTER ICNT=0 C C ZERO THE CORNER NUMBER INDEX COUNTER KRNCNT=0 C 2047 RETURN C C C [2] ENTER POINT C COMPUTE CORNERITY USING CITY BLOCK DISTANCES C FOR T1, T2. 200 ICNT=ICNT+1 KAVD=AVD*100.0 C SAVE LAST AVD FOR TESTING FOR NULL T1 L1AVD=L0AVD L0AVD=KAVD C C C IF ITFLAG=1 IF(ITFLAG)210,250,210 C C C THEN "ITFLAG=1: IN EXTREMUM" C IF IOLD=1 210 IF(IOLD)220,230,220 C C C THEN C BEGIN "CONTINUING ON EXTREMUM" C IF |KMAX| < |KAVD| C SAVE LAST EXTREMUM AVC IN CASE T2 IS NULL 220 SVEXTAVC=AVC IF(IABS(KMAX)-IABS(KAVD))221,229,229 C THEN C BEGIN "FIND MAX" C 221 KMAX=KAVD IXMAX=KX IYMAX=KY DMAX=AVD C END "FIND MAX"; C SUM EXTREMUM AVD 229 EXTAVD=EXTAVD+AVD IT=IT+1 GOTO 2047 C END "CONTINUING ON EXTREMUM" C C C ------------------------------------------------------------- C ELSE C BEGIN "START NEW EXTREMUM" C COMMENT COMPUTE AND TEST CORNERITY OF C LAST EXTREMUM IF EXITS; 230 CONTINUE IOLD=1 C C "SAVE T1" IT1=IT T1AVD=TOTAVD T1ANGLE=ANGLE C C IF L1AVD < 0 IF(L1AVD)231,232,232 C THEN USE EXTREMUM STARTING POINT AVC; 231 IT1=0 T1AVD=0 T1ANGLE=AVC C C C "RESET COUNTERS" 232 EXTAVD=AVD IT=1 C KMAX=KAVD IXMAX=KX IYMAX=KY C IXFIRST=KX IYFIRST=KY C C RETURN 239 GOTO 2047 C END "START NEW EXTREMUM" C C C ------------------------------------------------------------ C C C " ITFLAG=0: OUTSIDE OF EXTREMUM" C ELSE C IF IOLD=0 250 CONTINUE C IF(IOLD)270,251,270 C THEN C BEGIN "CONTINUING BETWEEN POINTS" C IF (SIGN(KAVD) EQ SIGN(KOLDAVD)) S\251, TAD \KAVD S SPA CLA S TAD (-2 /MAKE -1 S IAC /MAKE +1 S DCA \I C S TAD \KOLDAVD S SPA CLA S TAD (-2 /MAKE -1 S IAC /MAKE +1 S DCA \J C KOLDAVD=KAVD C C IF(I-J)260,252,260 C THEN IT_IT+1, RETURN; 252 IT=IT+1 TOTAVD=TOTAVD+AVD GOTO 2047 C C C ELSE C BEGIN "COMPUTE CORNERITY" C SAVE T2 260 IT2=IT T2AVD=TOTAVD T2ANGLE=AVC C C IF LT2SVKAVD <0 IF(LT2SVKAVD)1200,1201,1201 C THEN USE LAST EXTREMUM VALUE OF AVC; 1200 IT2=0 T2AVD=0 T2ANGLE=SVEXTAVC C C COMPUTE CORNERITY FUNCTIONS 1201 AKMAX=KMAX TMAX=MAX(IT1,IT2) TMIN=MAX(1,MIN(IT1,IT2)) C CORN=AKMAX/FLOAT(MAX(IT1*IT2,1)) C C NOTE: ALTERNATE CORNERITY FORM! C@ CORN=AKMAX/(TMAX+0.000001) C T1C=T1AVD/FLOAT(MAX(IT1,1)) T2C=T2AVD/FLOAT(MAX(IT2,1)) EXC=EXTAVD/FLOAT(MAX(ITE,1)) JPCNTCRV=EXC*100.0/(T1C+T2C+EXC+0.000001) C T12SKEW=TMAX/TMIN TE12SKEW=TMAX/FLOAT(MAX(ITE,1)) C C FIND MINIMUM APERATURE WIDTH C CVT T2 ANGLE TO COMPLEMENT T2COMP=8.0-T2ANGLE CALL BNDHEMISPHERE(T1ANGLE,T2COMP,APC) APC=ABS(APC) CALL BNDHEMISPHERE(T1ANGLE,T2ANGLE,APA) APA=ABS(APA) C C AP=(IF APC > APA C THEN APA ELSE APC); IF(APA-APC)265,265,264 264 AP=APC T2ANGLE=T2COMP GOTO 266 265 AP=APA C 266 ANORMAL=T1ANGLE+(AP/2.0) C IF ANORMAL > 8.0 C THEN ANORMAL=ANORMAL-8.0 IF(ANORMAL-8.0)1262,1261,1261 1261 ANORMAL=ANORMAL-8.0 1262 CONTINUE C ICORNERITY=CORN C IF (100 > ICORNERITY > ITHCORN) S TAD \ICORNERITY S TAD (-D100 S SMA CLA S JMP \269 /NO, ICORNERITY > 100 C IF(ICORNERITY-ITHCORN)269,261,261 C THEN C IF IFIRST=1 C THEN WRITE(MEM,IBYTE,IXMAX,IYMAX) C ELSE IT_1; 261 CONTINUE IF(IFIRST)262,269,262 C C WRITE VALID CORNER. C IF /L 262 KRNCNT=KRNCNT+1 IF(ILSW)267,263,267 C C THEN LABEL (MEM,BYTE,IXMAX,IYMAX,255) 267 IZ=255 CALL BMPARM(IXMAX,IYMAX,IZ,MEM,IBYTE,1) CALL PACK2D GOTO 268 C C ELSE WRITE DATA ON CORNER ON THE LPT:; 263 WRITE(3,2000)KRNCNT,IXMAX,IYMAX,DMAX,IT1,ITE,IT2,CORN 2000 FORMAT('0#',I2,'[',I3,':',I3,'], AVDMAX=',F5.2,', IT1=',I3 1,', ITE=',I3,', IT2=',I3,', CORN=',F6.2) C WRITE(3,2001)T1C,EXC,T2C,JPCNTCRV,T12SKEW,TE12SKEW 2001 FORMAT(' T1AVD/IT1=',F5.2,', EXTAVD/ITE=',F5.2 1,', T2AVD/IT2=',F5.2,', %CURVE=',FI4,/ 2,' T12SKEW=',F5.2,', TE12SKEW=',F5.2) C WRITE(3,2002)T1ANGLE,T2ANGLE,AP,ANORMAL 2002 FORMAT(' T1ANGLE=',F6.2,', T2ANGLE=',F6.2 1,', APERATURE WIDTH',F6.2,' AT ', F5.2) C C C C GO PUSH 268 CALL BNDCSTAT(IXMAX,IYMAX,T1ANG,T2ANG,ANORM,ICORN,JPCNT,ICNT 1,AP,2) C C CLEAR FIRST SWITCH 269 IFIRST=0 C C RESET IT (ACC. T1) IT=1 TOTAVD=0.0 ANGLE=AVC C RETURN; GOTO 2047 C END "COMPUTE CORNERITY"; C END "CONTINUING BETWEEN POINTS" C C C ------------------------------------------------------------- C ELSE C BEGIN "END OF EXTREMUM" 270 IOLD=0 IXLAST=KX C SAVE THE EXTREMUM WIDTH ITE=IT C C SAVE FIRST AVD OF T2 LT2SVKAVD=KAVD TOTAVD=AVD C RESET IT IT=1 IYLAST=KY KOLDAVD=KAVD C SET FIRST SWITCH TO GET THE FIRST T1 C TO COMPUTE CORNERITY IFIRST=1 C RETURN; GOTO 2047 C END "END OF EXTREMUM"; C *******PARAMETERS***** J=0 I=0 END