C PROGRAM ISOL2.FT C ---------------- C SUBROUTINE ISOL2(LX1,LY1,LX2,LY2,ITHR,ITSW,NPOINTS,IFLAG 1,IBM1,IHGH1,IBM2,IHGH2,IXPOSITION,IYPOSITION,IH,ETA) C 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 30, 1977 C NOV 29, 1977 C NOV 28, 1977 C SEPT 11, 1977 C SEPT 9, 1977 C SEPT 8, 1977 C SEPT 7, 1977 C SEPT 6, 1977 C C INTRODUCTION C ------------ C COMPUTE THE MIN CONVOLUTION OF LINES PERPENDICULAR TO C LINE [(1):(2)]. C AT EACH POINT ALONG THE LINE [(1):(2)] (AT ANGLE THETA+90), C LINES OF SIZE r=3,5,7,9,11 PIXELS ARE COMPUTED SUCH THAT THEY ARE C PERPENDICULAR TO THE POINT K ON THE LINE. THEY EXTEND OUT C ON EITHER SIDE OF [(1):(2)] TO (r-1)/2 AT ANGLE ETA=THETA+90 DEGREES. C C THE AVERAGE DENSITY OF EACH LINE SEGMENT C IS COMPUTED AND A HEURISTIC Hrk IS COMPUTED C WHERE: C k= k'th point on line segment [(1):(2)]. C r=3,5,7,9,11 C C Hrk=Davg(r,k,theta) C C THEN A COMPOSITE HEURISTIC, Hk IS COMPUTED SUCH THAT C C Hk=LOG(PRODUCT(Hrk)) C r=3,5,7,9,11. C C THEN AFTER THE LINE FILTER IS APPLIED AND Hk COMPUTED FOR C ALL k IN THE CYTOPLASM REGION (k's IN CC REGIONS ARE C NOT COUNTED AND Hk FOR THESE REGIONS IS SET TO ZERO), C A TEST IS PERFORMED TO DETERMINE WHETHER A LIGHTEND TEXTURE C REGION EXISTS. C C COMPUTE: Hmin=MIN(Hk over k) at k=Kmin. C Havg=AVERAGE(Hk) over k. C C If (Havg-Hmin) < (ITHR% of Havg) C Then split at Kmin C Else no split; C C NOTE THAT ANGLES ARE COMPUTED IN DEGREES AND SINCE THEY C ARE NOT DISPLAYED, THEY AY BE THOUGHT OF AS BEING IN THE C CARTESIAN COORDINATE SYSTEM RATHER THAN THE LCS. C C ARGUMENTS C --------- C LX1/Y1:LX2/Y2 - CENTER POINTS OF [(1):(2)]. C ITSW - /T SWITCH C ITHR - HEURISTIC THRESHOLD FOR FINDING A CRACK. C NPOINTS - NPOINTS OF COMPUTE LINE STORED IN IH. C IH[1:512] - LINE DRAWN FROM IA TO IB PACKED C (X1,Y1),(X2,Y2),... STARTING AT IH(1). C IFLAG - MAXIMUM VALUE OF 1'S MASKED ON LINE ON ENTRY C IF A SPLIT IS TO BE PERFORMED C THEN SET IFLAG TO THE INDEX OF IH WHERE SPLIT IS C TO TAKE PLACE C ELSE RETURN 0; C IF FOUND POINT AT IX,IY,TYPE IZ) ELSE 0 C IBM1/IHGH1 - CC IMAGE TO BE PROPAGATED C IBM2/IHGH2 - GRAY VALUE IMAGE TO BE ANALYZED FOR LIGHT REGIONS. C C FBW4 DEBUG SWITCHES C ------------------- C@C 0001 [1] RETURN IMMEDIATELY TO ISOL1 WITH NO CHECKING C 0700 [2.1] PRINT ANGLES BEFORE TEST C 0100 [2.4.1] K,KX,KY C 0400 [2.4.1.3] K,FL,IX,IY,IZ C 0200 [2.4.3] K,IR,KAVG,H C OPDEFS C ------ C S OPDEF RIF 6224 S OPDEF DMAGO 6070 S SKPDF DMASKP 6071 S OPDEF DMAWC 6072 S OPDEF DMACA 6073 S OPDEF DMACLR 6074 S OPDEF EXDMA1 6524 S OPDEF EXDMA2 6525 C C S OPDEF TADI 1400 S OPDEF DCAI 3400 C S OPDEF DISP1 6435 S OPDEF DISP2 6436 C C S OPDEF SHL 7413 S OPDEF MUY 7405 S OPDEF DVI 7407 C S OPDEF MQA 7501 S OPDEF BSW 7002 S OPDEF MQL 7421 S OPDEF KRS 6034 C C S OPDEF LDXP 6443 S OPDEF LDYP 6444 C C C [0] DUMMY VARIABLE DEF S DUMMY DUMIH GOTO 123 S CPAGE 2 S DUMIH, BLOCK 2 C C SETUP POINTER TO DUMMY VARIABLE POINTER TO IH[1]; S \123, TAD \IH S DCA DUMIH S TAD \IH# S DCA DUMIH# C C C [1] INITIALIZATION C SET IT TO MAX # OF 1'S ON LINE IN CNi. MAX1IZ=IFLAG IXOFFSET=IXPOSITION IYOFFSET=IYPOSITION C C SET MAX LINE SIZE C **** SHOULD IT BE 256 TO PREVENT OVF SINCE IH IS D.P.?**** IHSIZE=392 C C IF NPOINTS > IHSIZE C THEN RETURN S TAD I \NPOINTS S CIA S TAD \IHSIZE S SPA CLA S JMP \2047 /RETURN C C C@C**********DEBUG******* C@C IF FBW4['0001]=1 C@C THEN RETURN C@S 6344 /FBW4 C@S AND (0001 C@S SZA CLA C@S JMP \2047 /RETURN C@C********************** C C C [2] ISOLATE CVFACTOR=3.14159/180.0 HALFPI=1.57079 C C C [2.1] COMPUTE THE ANGLE OF THE LINE Y1=LY2-LY1 X1=LX2-LX1 THETA=ARCTAN(Y1,X1) C ETA=THETA+(90.0*CVFACTOR) C SINETA=SIN(ETA) COSETA=COS(ETA) C***********DEBUG****** S 6344 /FBW4 S AND (0700 /BITS 3,4,5 S SNA CLA S JMP \1740 WRITE(4,1741)THETA/CVFAC,ETA/CVFAC,SINETA,COSETA,MAX1IZ 1741 FORMAT(' THETA=',F7.1,' DEG, ETA=',F7.1 1,', SINETA=',F6.3,', COSETA=',F6.3,',MAX1IZ=',I3) 1740 CONTINUE C************************** C C C [2.2] SETUP REAL COORDINATES X1=LX1 Y1=LY1 C [2.4] ANALYZE GRAY SCALE DATA ON THE LINE IN IH FROM BMI2. C IF (EXISTS ZERO PIXEL IN LINE IN BMI1) OR C (EXISTS PIXEL K ON LINE IN BMI1 SUCH THAT C ((IZ NEQ 1) AND IZ NEQ IA) AND (IZ NEQ IB))) C THEN IGNORE I:J PAIR C ELSE C BEGIN "PROCESS CYTOPLASM PIXEL" C CONVOLVE WINDOW WITH SIZES 3:11 STEP BY 2; C END "PROCESS CYTOPLASM PIXEL"; C C INITIALIZATION OF HEURISTIC SUM AND INDEX IHNINDEX=-1 HMIN=1.0E+20 C IHXINDEX=-1 HMAX=-1.0E+20 C HSUM=0.0 I1CNT=0 IFIRST=-1 C DO 240 K=1,NPOINTS C BEGIN "PROCESS LINE" C CPAGE 3 S JMS TTYCTL S JMP \2047 /RETURN NOW! C C C [2.4.1] PROCESS K'TH LINE FILTER STARTING AT BMI1 > 1. H=1.0 C C COMPUTE: KX=IH(2*(K-1)+1), KY=IH(2*K) S CLA CMA S TAD \K /K-1 S CLL RAL /*2 S TAD \IH# S DCA DUMIH# S TAD I DUMIH /GET X S DCA \KX C S INC DUMIH# S TAD I DUMIH /GET Y S DCA \KY C IX=KX IY=KY C S TAD \IX S DISP1 S TAD \IY S DISP2 C C C IF (IZ_FETCH2D(IBM1,IHGH1,IX,IY)) > 1 242 MEM=IBM1 IBYTE=IHGH1 S JMS FETCH2D C C************DEBUG********** S 6344 /FBW4 S AND (0100 S SNA CLA S JMP \1799 /NO WRITE(4,1798)K,KX,KY 1798 FORMAT('0K=',I3,',"K"[',I4,',',I4,']') 1799 CONTINUE C*************************** S TAD (-2 S TAD \IZ S SPA CLA S JMP \243 /CONTINUE C C THEN C BEGIN "PROCESS FIRST CC PIXEL C SAVE CCi (III VALUE) C IF IFIRST=-1 C THEN IFIRST_IZ; S TAD \IFIRST S CLL RAL /-1==>LINK BIT S CLA S TAD \IZ S SZL S DCA \IFIRST S CLA C END "PROCESS FIRST CC PIXEL"; C 243 DO 260 IR=3,11,2 C COMPUTE AVG DENSITY FOR EACH CASE C INIT MSKCNT=0 KSUM=0 C C [2.4.1.1] COMPUTE FEATURES FOR FILTER C COMPUTE: IRHALF=(IR-1)/2 S CLA CMA S TAD \IR S CLL RAR /"/2" S DCA \IRHALF C C MAX1IZ=0 C DO 265 L=1,IR C NOTE: FL WILL RANGE FROM -IRHALF:+IRHALF+1 FL=(IRHALF+1)-L C C COMPUTE STRIGHT LINE. IX=KX+IFIX(FL*COSETA) IY=KY+IFIX(FL*SINETA) C C DISPLAY THE POINT S TAD \IX S TAD \IXOFFSET S LDXP S TAD \IY S TAD \IYOFFSET S LDYP C C C [2.4.1.2] IZ <== FETCH2D(IBM1,IHGH1,IX,IY) MEM=IBM1 IBYTE=IHGH1 S JMS FETCH2D C C IF IZ = 1 C THEN CONTINUE C ELSE "DO NOT SUM BMI2 PIXELS" GOTO [2.4.1.4]; S CLA CMA S TAD \IZ S SZA CLA S JMP \265 /IGNORE POINT C C C [2.4.1.3] INCREMENT POINT COUNTER, AND C IZ<==FETCH2D(IBM2,IHGH2,IX,IY) MSKCNT=1+MSKCNT C MEM=IBM2 IBYTE=IHGH2 S JMS FETCH2D C C C COMPUTE: MAX1IZ=MAX(IZ,MAX1IZ) S TAD \IZ S CIA S TAD \MAX1IZ S CLL RAL S CLA S TAD \IZ S SZL S DCA \MAX1IZ S CLA C KSUM=KSUM+IZ C C****DEBUG**** S 6344 /FBW4 S AND (0400 S SNA CLA S JMP \1240 /NO WRITE(4,1251)K,FL,IX,IY,IZ 1251 FORMAT(' #',I3,', FL=',F5.0,', [',I3,',',I3,']=',I3) 1240 CONTINUE C******************* C C C [2.4.1.4] CONTINUE 265 CONTINUE C C C [2.4.2] COMPUTE POINT HEURISTIC OF SIZE IR C IF KSUM > 0 C THEN KAVG_KSUM/MSKCNT C ELSE KAVG_MAX1IZ; KAVG=MAX1IZ C S TAD \KSUM S SNA CLA S JMP \267 /=0 C S TAD \KSUM S MQL S TAD \MSKCNT S DCA DV1 S CPAGE 2 S DVI S DV1, 0 /MSKCNT S CLA S MQA /QUOTIENT S DCA \KAVG C 267 CONTINUE C C C C [2.4.3] COMPUTE COMPOSITE HEURISTIC C BASED ON PRODUCT OF HEURISTICS AT K FOR R=3 TO 11. C C COMPUTE: KAVG_MAX(KAVG,1) S TAD \KAVG S SNA S IAC /SET =1 S DCA \KAVG H=H*FLOAT(KAVG) C*************DEBUG***** S 6344 /FBW4 S AND (0200 S SNA CLA S JMP \1261 /NO WRITE(4,1260)K,IR,KAVG,H 1260 FORMAT(' K=',I3,', IR=',I3,', KAVG=',I3,', H=',E9.2) 1261 CONTINUE C************************** 260 CONTINUE H=ALOG(H+1.0) C C COMPUTE THE MIN Hk. C IF H > HMIN C THEN HMIN_H, IHNINDEX_K; IF(H-HMIN)293,291,291 293 HMIN=H IHNINDEX=K C C IF H < HMAX C THEN HMAX_H, IHXINDEX_K; 291 IF(H-HMAX)294,295,295 295 HMAX=H IHXINDEX=K C C SUM HEURISTIC FUNCTION OF K 294 HSUM=HSUM+H I1CNT=1+I1CNT C 240 CONTINUE C C C [3] COMPUTE THE AVERAGE Hk 300 HAVG=MAX(I1CNT,1) HAVG=HSUM/HAVG C C COMPUTE THE RELATIVE EXTENT OF THE MIN IRELMIN=100.0*(HAVG-HMIN)/(HAVG+0.000001) C WRITE(4,320)I1CNT,IHSIZE,HAVG,HMIN,IHNINDEX,IRELMIN 1,HMAX,IHXINDEX 320 FORMAT(' I1CNT=',I4,', IHSIZE=',I4,', HAVG=',F7.2,', HMIN=' 1,F7.2,', IHNINDEX=',I3,/,', (HAVG-HMIN)/HMIN=',I4 2,'%, HMAX=',F7.2,', IHXINDEX=',I5) C C C C [3.1] TEST SUCESSFUL LINE DATA FOR POSSIBLE C LIGHT REGIONS PERPENDICULAR TO LINE INDICATING THE C DISCONTINUITY. C FIND MIN HEURISTIC K AND TEST IF RELATIVE DIFFERENCE IS > THRESHOLD. C RETURN IFLAG=IHNINDEX IF OK TO SPLIT ELSE RETURN IFLAG=0. IF(IRELMIN-ITHR)301,302,302 301 IFLAG=0 GOTO 2047 302 IFLAG=IHNINDEX C END "PROCESS LINE"; C C C [4] RETURN 2047 RETURN C ********************************************************* C SUBROUTINE: F E T C H 2 D * C ********************************************************* C FETCH IZ=BM(MEM&IY&IX,IBYTE); C C FETCH AN 8-BIT BYTE FROM THE SPECIFIED BM C C ARGS IN COMMON FOR SPEED C ------------------------ C MEM - BM NUMBER 0 TO 7 C IBYTE - 0 (LOW), 1 FOR HIGH BYTE OF 16 BIT BYTE C IX - XADDR , 0 TO 255 C IY - YADDR, 0 TO 255 C IZ - RESULT. C S CPAGE 3 S RFETCH2D, JMP I FETCH2D S FETCH2D, 0 C C C [1] INITIALIZE PDP8/E REGISTERS S DMACLR S TAD PBUFF /BUFFER POINTER S DMACA /LOAD ADDRESS REGISTER S CLA CLL IAC RAL /2 WORDS S DMAWC /LOAD WORD COUNT REGISTER C C C [2] SET UP I/O DEVICE ADDRESS REGISTERS C S TAD \MEM S CLL RTL; RTL /MOVE BITS [9:11] ==> [5:7] S MQL S TAD \IY S CLL RTR; RTR /MOVE BITS [4:7] ==> [8:11] S AND (0017 S MQA S EXDMA1 /HIGH-ORDER WORD C S TAD \IY C@S CLL RTR; RTR; RAR /MOVE BITS [8:11] ==> [0:3] S BSW; RTL /ALTERNATE MICROCODE S AND (7400 S TAD \IX S EXDMA2 /LOAD LO-ORDER WORD C C C [3] EXECUTE COMMAND C S RIF /GET CURRENT DATA FIELD FOR READ S DMAGO /DO IT! S DCA 7 /ZERO COUNTER C S RBM, DMASKP /WAIT 'TIL DONE S SKP S JMP F2D4 /DONE WITH I/O S ISZ 7 S JMP RBM /NOT YET S JMP \100 /OVERFLOW C C C [4] GET 8 BIT WORD FROM 16 BIT DATA C S F2D4, TAD \IBYTE /=1 FOR HIGH PACKING, =0 FOR LOW PACKING S SZA CLA S JMP GETHIGH C C C [4.1] GET LOW BYTE S TAD BUFF S AND (0377 S DCA \IZ S JMP RFETCH2D /DONE, RETURN C C C [4.2] GET HIGH BYTE S GETHIGH, TAD BUFF S MQL S TAD BUFF# S CPAGE 2 S SHL S 3 /LEFT SHIFT 4 BITS S AND (377 S DCA \IZ /STORE IT S JMP RFETCH2D /DONE, RETURN C C C C [5.] FATAL BM DMA TIMEOUT ERROR S\100, CLA S DMACLR WRITE(1,101) 101 FORMAT('ISOL2 DMA TIMEOUT ERROR, RE-BOOT THE SYS:!') S HLT GOTO 100 C C BUFFER S PBUFF, BUFF S CPAGE 2 S BUFF, BLOCK 2 C C C ************************************************************ C SUBROUTINE: T T Y C T L (INTERNAL) C ************************************************************ C S CPAGE 3 S RTTYC, JMP I TTYCTL S TTYCTL, 0000 /ENTRY C S KSF /ANYTHING TYPED S JMP NORMAL /NO, RETURN NORMALLY S KRB /GET TYPED CHARACTER S AND (0177 /TAKE CARE OF PARITY PROBLEMS S TAD (-17 /TEST FOR CTRL/O S SNA /SKIP IF NOT CTRL/O S JMP RTTYC /ABORT CALLING ROUTINE (ERROR RETURN) S TAD (-4 /TEST FOR CTRL/S [-17-4=-23(OCTAL)] S SZA CLA /SKIP IF CTRL/S S JMP NORMAL /NOT CTRL/O OR CTRL/S SO RETURN NORMALLY C S SLEEP,KSF /WAIT FOR CTRL/Q S JMP SLEEP /KEEP WAITING S KRB /READ CHARACTER S AND (0177 S TAD (-17 /IS IT A CTRL/O? S SNA /SKIP IF NOT S JMP RTTYC /YES, ABORT S TAD (-2 /TEST FOR CTRL/Q (-17-2=-21 OCTAL) S SZA CLA /SKIP IF SO S JMP SLEEP /NOPE, KEEP SLEEPING C S NORMAL,INC TTYCTL /INCREMENT RETURN ADDRESS FOR NORMAL RETURN S CLA /SAFETY VALVE S JMP RTTYC /RETURN C************** P A R A M E T E R S ************* END