C PROGRAM SEGB3.FT C ---------------- C S ENTRY SEGB3 S CPAGE 2 S SEGB3,BLOCK 2 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 FEB 8, 1978 C NOV 18, 1977 C OCT 26, 1977 C SEPT 2, 1977 C JUNE 26, 1977 C JUNE 24, 1977 C JUNE 23, 1977 C JUNE 16, 1977 C JUNE 9, 1977 C JUNE 7, 1977 C C PURPOSE C ------- C SEGB3 SETS UP A BOOLEAN CONJUNCTION TEST (IVAL=1) C AND ALLOWS TESTING OF IT (PASSING ARGUMENTS THROUGH COMMON) C FOR IVAL=2. C C IVAL FUNCTION C ---- -------- C 1 SET THE SIZING FROM A SET OF SIZE SPECS FROM THE CD C IF /M IS SET. IF NO /M IS SPECIFIED, THEN USE THE C SPEC SPECIFIED WITH THE INITIAL SEGBND CALL. C C THE SPECS ARE ENTERED AS: C *LOWER LIMIT, UPPER LIMIT,(OPT NUM,DENOM)/i C WHERE THE ARRAYS ALL(i) and AUL(i) ARE COMPUTED AS FOLLOWS: C ANUM=FLOAT(MAX(1,NUM)) C ADENOM=FLOAT(MAX(1,DENOM)) C IZ=SEARCH /0 TO /9 FOR IZ C IUSEFEATURE(I)_TRUE C ALL(I)=(LOWER LIMIT)*(ANUM/ADENOM) C AUL(I)=(UPPER LIMIT)*ANUM/ADENOM) C C 2 TEST THE SIZES USING THE BOOLEAN EXPRESSION SETUP DURING C 0 OR 1 PASSING ARGUMENTS FOR THE FEATURES THROUGH COMMON C PUC AS FC C NC AS MACTIVE C AREA AS FILE (PIXELS)==>MICRONS C PERIMETER AS CURSYM C DENSITY AS EXT[1:2]==>FLOAT C FILLED AREA AS IMONR[1:2] PELs==>FC (U.) C # B.P AS MODEE C MIN HOR RECT AS FA=(KX2+1-KX1)*PUC C MIN VERT RECT AS FB=(KY2+1-KY1)*PUC C # EDGES TCH FRAME AS MTROP C C ALSO COMPUTE AND RETURN FEATURES: C FEATURE COMMON VARIABLE C ------- --------------- C # B.P. SDEVICE(1) C DDENS/AREA SDEVICE(2) C P*P/AREA SDEVICE(3) C # TOUCHING EDGES MTROP C C THE TEST ALGORITHM IS AS FOLLOWS: C C IF (FOR ALL I SUCH THAT C (IUSEFEATURE(I) AND C (ALL(I) LEQ FEATURE(I) LEQ AUL(I))) ) C THEN RETURN (LSSAVE<==1) C ELSE RETURN (LSSAVE<==0); C C 3 IF LSSAVE=1 THEN PRINT VARIOUS MODES OF FEATURE C INFORMATION (I.E. IF /B SWITCH SET ALSO DUMP ONTO FILE C IF /L THEN ALSO DUMP ONTO LPT). C OPDEFS C ------ S OPDEF TADI 1400 S OPDEF DCAI 3400 C C C C S OPDEF CLAMQ 7621 S OPDEF MQA 7501 S OPDEF MQL 7421 S OPDEF BSW 7002 C C DIMENSION FEATURE(10), ALL(10), AUL(10),IUSEFEATURE(10) C C C [0] DISPATCH TO SETUP (1) OR TEST(2) GOTO(100,200,300),IVAL C C C [1] SETUP C COPY UNAME FROM FC (PUT THERE BY BMON2.SV) 100 UNAME=FC C C C [1.1] INIT USE ARRAY DO 101 I=1,10 S CLA CMA S TAD PIUSEFEATURE S TAD \I S DCA 7 S DCAI 7 101 CONTINUE C C C [1.2] IF NOT /M THEN USE GIVEN SPEC C COMPUTE: LCNT=ISW(13) S \103, TAD (D12 S TAD PISW S DCA 7 S CPAGE 4 S DCA \LCNT S TADI 7 S DCA \LCNT S TAD \LCNT S SNA CLA S JMP \104 C C C [1.3] /M, GET SPECS UNTIL NULL SPEC SWITCH. 105 CALL BCDSPEC C C C [1.4] GET /IZ SWITCH AND SAVE 104 DO 106 IZ=1,10 C IF ISW(26+IZ)=1 C THEN GOTO 107; S TAD (D25 S TAD PISW S CPAGE 5 S TAD \IZ S DCA 7 S TADI 7 S SZA CLA S JMP \107 106 CONTINUE C C IF /M IS ACTIVE C THEN EXIT C ELSE ASSUME /0 (AREA); S TAD \LCNT /"/M" S SZA CLA S JMP \2047 /EXIT C C ASSUME /0, AREA S CLA IAC /+1 S DCA \IZ C C C [1.5] STORE ENTRY C COMPUTE: IUSEFEATURE(IZ)=1 S\107, CLA CMA S TAD \IZ S TAD PIUSEFEATURE S DCA 7 S CLA IAC S DCA I 7 C C IF NOT /M C THEN F_1.0 C ELSE COMPUTE F_NUM/DENOM INUMERATOR=1 IDENOMINATOR=1 S TAD \LCNT S SNA CLA S JMP \109 /F=1.0 C C COMPUTE: INUMERATOR=ICNUM(3) S TAD (2 S TAD PICNUM S DCA 7 S CPAGE 4 S DCA \INUMERATOR S TADI 7 S SNA S IAC /=1 S DCA \INUMERATOR C C COMPUTE: IDENOMINATOR=ICNUM(4) S TAD (3 S TAD PICNUM S DCA 7 S CPAGE 4 S DCA \IDENOMINATOR S TADI 7 S SNA S IAC /=1 S DCA \IDENOMINATOR C 109 F=FLOAT(INUMERATOR)/FLOAT(IDENOMINATOR) DMIN=FLOAT(ICNUM)*F ALL(IZ)=DMIN C S TAD \ICNUM# S DCA \KWC DMAX=FLOAT(KWC)*F AUL(IZ)=DMAX C C [1.6] PRINT THIS ENTRY S CLA CMA /-1 S TAD \IZ S DCA \IZ WRITE(3,160)DMIN,DMAX,IZ 160 FORMAT(' [',F11.2,':',F11.2,']/',I1) C C C [1.7] IF /M C THEN GOT [1.3] ELSE RETURN S TAD \LCNT S SNA CLA S JMP \2047 /RETURN GOTO 105 C C C C [2] TEST C [2.1] FILL UP THE FEATURE ARRAY C COPY PUC FROM FC USED TO PASS THE ARG. 200 PUC=FC C C COMPUTE HOR SIZE FA=FLOAT(KX2+1-KX1)*PUC C C COMPUTE VERT SIZE FB=FLOAT(KY2+1-KY1)*PUC C C CVT FILLED AREA TO MICRONS ==>FC CALL DPCVRT(IMONR,FC,-1) FC=FC*PUC*PUC C FILE=FILE*PUC*PUC FEATURE(1)=FILE C C PERIMETER FEATURE(2)=CURSYM C C DENSITY IS PASSED IN EXT[1:2] C CVT TO FP CALL DPCVRT(EXT,EXT,-1) C COMPUTE DENSITY/AREA F=EXT/FILE FEATURE(3)=F C SAVE FOR PRINTING SDEVICE(2)=F C C MIN HORZ ENCL RECT FEATURE(4)=FA C C MIN VERT ENCL RECT FEATURE(5)=FB C C FILLED AREA FEATURE(6)=FC C C P*P/A F=CURSYM*CURSYM/FILE FEATURE(7)=F C SAVE IT IN SDEVICE(3) FOR PRINTING LATER SDEVICE(3)=F C C@C LOG(DENSITY) C@C FROM RECTORY PG 684: C@C F=(X-1)/(X+1); X>0; C@C LN(X)=2[A+(A**3)/3+...+(A**2N+1)/(2N+1)]; C@ F=(EXT-1.0)/(EXT+1.0) C@ ALOG=F C@ DO 208 I=3,13,2 C@208 ALOG=ALOG+(A**I)/FLOAT(I) C@ FEATURE(8)=2.0*ALOG C **** FOR NOW MAKE IT THE DENSITY**** FEATURE(8)=EXT C C # BOUNFRY POINTS FEATURE(9)=MODEE C COPY FOR PRINTING LATER C COMPUTE:SDEVICE(1)=MODEE SDEVICE(1)=MODEE C C # EDGES TOUCHING OBJECT MTROP=0 C IF KX1=2 THEN INCREMENT MTROP S TAD (-2 S TAD \KX1 S SNA CLA S ISZ \MTROP /YES C C IF KY1=2 THEN INC MTROP S TAD (-2 S TAD \KY1 S SNA CLA S ISZ \MTROP /YES C C IF KX2=255 THEN INC MTROP S TAD (-D255 S TAD \KX2 S SNA CLA S ISZ \MTROP /YES C C IF KY2=255 THEN INC MTROP S TAD (-D255 S TAD \KY2 S SNA CLA S ISZ \MTROP /YES C FEATURE(10)=MTROP C C C [2.2] TEST IF FEATURES USED ARE OK LSSAVE=1 DO 210 I=1,10 S CLA CMA S TAD \I S TAD PIUSEFEATURE S DCA 7 S TAD I 7 S SNA CLA S JMP \210 C C GET LIMITES AND TEST F=FEATURE(I) IF(ALL(I)-F)213,213,214 213 IF(AUL(I)-F)214,210,210 214 LSSAVE=0 GOTO 2047 210 CONTINUE C C RETURN S\2047, RETRN SEGB3 C C [3] PRINT FEATURE DATA ON VARIOUS DEVICES C ACCORDING TO SWITCHES SET C IF LSSAVE=1 C THEN PRINT ELSE RETURN S\300, TAD \LSSAVE S SNA CLA S JMP \2047 /DONT PRINT C C COMPUTE ACTUAL CORNER C C [3.1] THEN PRINT THE NODE DO 301 INDEX=1,4 C IF INDEX =1 THEN PRINT; S CLA CMA S TAD \INDEX S SNA S JMP \302 /PRINT, =1; C C IF INDEX=2 THEN IGNORE; S TAD (-1 S SNA S JMP \301 /DO NOT PRINT, =2 C C IF INDEX=3 AND IOUTSPOOL=1 C THEN PRINT; S TAD (-1 S SZA CLA S TAD (4 /=4, MAKE IOUTSPOOL TEST FAIL S TAD (-1 S TAD \IOUTSPOOL S SNA CLA S JMP \302 /=3 AND IOUTSPOOL=1, PRINT C C IF INDEX=4 AND /B C THEN PRINT S TAD \INDEX S TAD (-4 S SZA CLA S JMP \301 /NO S TAD \ISW# S SNA CLA S JMP \301 /NO C C 302 WRITE(INDEX,303)MACTIVE,(KX1-1),(KY1-1),FA,FB,FC C 303 FORMAT(' CC#=',I4,',[HP,VP,HS,VS]=[',I3,',',I3,',', 1,F6.1,',',F6.1,'], FILLED A=',F6.1) C WRITE(INDEX,305)EXT,FILE,CURSYM,UNAME 305 FORMAT(9X,'D=',F9.0,', A=',F7.1,', P=',F7.1,' ',A6) C C PRINT # B.P , D/A , AND P**2/A , NUMBER OF EDGES WRITE(INDEX,304)SDEVICE,MTROP 304 FORMAT(9X,'# B.P.=',F6.0,', D/A=',F9.1,', (P*P)/A=',F9.3, 1,', # EDGES=',I2) C 301 CONTINUE GOTO 2047 C C C ***************PARAMETERS********** S PISW, \ISW S PIUSEFEATURE, \IUSEFEATURE S PICNUM, \ICNUM END