C PROGRAM FILGAP.FT 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 FEB 6, 1978 C C C C INTRODUCTION C ------------ C FILGAP.FT IS A CHAINED PROGRAM USED WITH BMON2 C IT RECEIVES ITS ARGUMENTS FROM THE CD AREA AND THE IBM1,IHGH1 C IBM2,IHGH2, JBM, JHGH VARIABLES IN COMMON. COMMON IS RESTORED C FIRST BEFORE THE FUNCTION (TO BE INSERTED INTO THE BODY) IS C EVALUATED. AFTER THE FUNCTION IS PERFORMED, COMMON C IS SAVED AND BMON2 IS CHAINED BACK TO. C ANY COMPUTATIONS ARE DONE, THE ARGUMENTS ARE THEN CHECKED C C _FILGAP,,Threshold t - Fill gaps in narrow C dark lines. The filter looks for a light gap of 1 to 2 C pixels in length in a narrow dark line of 1 to 2 pixels C wide. The filter consists of a 5x5 neighborhood in 8 C different orientations (actually 16 but 8 are C symmetric). C Let Fi be one of the eight filters. Then the Gj(x,y) is C computed as: C C Gj(x,y) = If Max{Fi(x,y)} > t C Then Max(25-neighborhood of (x,y)) C Else Gi(x,y); C C The eight filters are: C C 0 0 +4 0 0 C 0 0 +2 0 0 C a -2 -1 -6 -1 -2 C 0 0 +2 0 0 C 0 0 +4 0 0 C C 0 0 +2 +2 0 C -1 0 +1 +1 0 C b -1 -1 -6 -1 -1 C 0 +1 +1 0 -1 C 0 +2 +2 0 0 C C -2 0 0 0 +4 C 0 -1 0 +2 0 C c 0 0 -6 0 0 C 0 +2 0 -1 0 C +4 0 0 0 -2 C C 0 +2 +2 0 0 C 0 +1 +1 0 -1 C d -1 -1 -6 -1 -1 C -1 0 +1 +1 0 C 0 0 +2 +2 0 C C The filters a', b', c' and d' are filters a, b, c, and C d rotated 90 degrees. C C 0 0 -2 0 0 C 0 0 -1 0 0 C a' +4 +2 -6 +2 +4 C 0 0 -1 0 0 C 0 0 -2 0 0 C C 0 0 -1 -1 0 C +2 +1 -1 0 0 C b' +2 +1 -6 +1 +2 C 0 0 -1 +1 +2 C 0 -1 -1 0 0 C C +4 0 0 0 -2 C 0 +2 0 -1 0 C c' 0 0 -6 0 0 C 0 -1 0 +2 0 C -2 0 0 0 +4 C C 0 -1 -1 0 0 C 0 0 -1 +1 +2 C d' +2 +1 -6 +1 +2 C +2 +1 -1 0 0 C 0 0 -1 -1 0 C C The 5 line buffers are stored in Field 6. C C C OPDEFS C ------ S OPDEF TADI 1400 S OPDEF DCAI 3400 C S OPDEF DISP1 6435 S OPDEF DISP2 6436 C C S OPDEF SWAB 7431 S OPDEF SWBA 7447 C S OPDEF MQA 7501 S OPDEF MQL 7421 S OPDEF KRS 6034 S OPDEF BSW 7002 C C C 5-LINE BUFFER NOTATION C C J11 J12 J13 J14 J15 C J21 J22 J23 J24 J25 C J41 J42 J43 J44 J45 C J51 J52 J53 J54 J55 C [0] INITIALIZATION C [0.1] INITIALIZATION WRITE(1,995) WRITE(3,995) 995 FORMAT(' FILGAP 2/6/78 - 4:06PM') ET=TIMER(0) CALL DAYTIME(1) CALL DAYTIME(3) C C C C [0.2] VERIFY BM SPECS S JMS CKIN S JMS CKOUT C@@S JMS CKIN2 C C C [1] FILTER THE IMAGE. DO 200 IY1=KY1,KY2 IY=IY1-1 S TAD \IY S DISP2 C C C GET A NEW BUFFER S JMS READNEXTLINE C C C [1.1] PROCESS A LINE DO 210 IX1=KX1,KX2 IX=IX1-1 S TAD \IX S DISP1 C S JMS GET5X5 C C PROCESS THE 8 FILTERS! C 0 0 +4 0 0 C 0 0 +2 0 0 C a -2 -1 -6 -1 -2 C 0 0 +2 0 0 C 0 0 +4 0 0 C C GET + (A) SUM S TAD \J13 S CLL RTL /*4 S TAD \J23 /*2 S TAD \J23 S DCA 7 S TAD \J53 S CLL RTL /*4 S TAD 7 S TAD \J43 /*2 S TAD \J43 S DCA 7 C C GET - (A) SUM S TAD \J33 S CLL RAL /*2 S TAD \J33 S CLL RAL /(3*J33)*2 S TAD \J31 S TAD \J31 S TAD \J32 S TAD \J34 S TAD \J35 S TAD \J35 S CIA S TAD 7 S DCA \IFA C C 0 0 +2 +2 0 C -1 0 +1 +1 0 C b -1 -1 -6 -1 -1 C 0 +1 +1 0 -1 C 0 +2 +2 0 0 C C GET + (B) SUM S TAD \J13 S TAD \J13 S TAD \J14 S TAD \J14 S TAD \J23 S TAD \J24 S TAD \J42 S TAD \J43 S TAD \J52 S TAD \J52 S TAD \J53 S TAD \J53 S DCA 7 C C GET - (B) SUM S TAD \J33 S CLL RAL /*2 S TAD \J33 S CLL RAL /(3*J33)*2 S TAD \J13 S TAD \J12 S TAD \J14 S TAD \J15 S CIA S TAD 7 S DCA \IFB C C C C -2 0 0 0 +4 C 0 -1 0 +2 0 C c 0 0 -6 0 0 C 0 +2 0 -1 0 C +4 0 0 0 -2 C C GET + (C) SUM S TAD \J15 S CLL RTL /*4 S TAD \J24 S TAD \J24 S TAD \J42 S TAD \J42 S DCA 7 S TAD \J51 S CLL RTL /*4 S TAD 7 S DCA 7 S DCA 7 C C GET - (C) SUM S TAD \J33 S CLL RAL /*2 S TAD \J33 S CLL RAL /(3*J33)*2 S TAD \J13 S TAD \J13 S TAD \J22 S TAD \J44 S TAD \J55 S TAD \J55 S CIA S TAD 7 S DCA \IFC C 0 +2 +2 0 0 C 0 +1 +1 0 -1 C d -1 -1 -6 -1 -1 C -1 0 +1 +1 0 C 0 0 +2 +2 0 C C The filters a', b', c' and d' are filters a, b, c, and C d rotated 90 degrees. C C 0 0 -2 0 0 C 0 0 -1 0 0 C a' +4 +2 -6 +2 +4 C 0 0 -1 0 0 C 0 0 -2 0 0 C C 0 0 -1 -1 0 C +2 +1 -1 0 0 C b' +2 +1 -6 +1 +2 C 0 0 -1 +1 +2 C 0 -1 -1 0 0 C C +4 0 0 0 -2 C 0 +2 0 -1 0 C c' 0 0 -6 0 0 C 0 -1 0 +2 0 C -2 0 0 0 +4 C C 0 -1 -1 0 0 C 0 0 -1 +1 +2 C d' +2 +1 -6 +1 +2 C +2 +1 -1 0 0 C 0 0 -1 -1 0 C 210 CONTINUE C C WRITE OUT THE LINE MEM=JBM IBYTE=JHGH S TAD \KPTR3 S DCA WROUT# S TAD (6261 /CDF 60 S DCA WROUT C S CALL 2,T3BUF S WROUT, ARG WROUT S ARG (3 C 200 CONTINUE C C C [999] RETURN GOTO 998 999 WRITE(1,996) 996 FORMAT('BAD BM SPECIFICATION!') 998 ET=TIMER(1) CALL CHAIN('BMON2') C*************************************************** C *PROCEDURE I N I T B U F C****************************************************** C C C INIT THE TRIPLE LINE BUFFER S CPAGE 3 SRINITBUFF, JMP I INITBUFF S INITBUFF, 0 /ENTRY C C [IN.1] SET THE RING POINTERS KPTR1=1024 KPTR2=0 KPTR3=256 KPTR4=512 KPTR5=768 C C C [IN.2] ZERO FIELD 6 S DCA 7 S CPAGE 10 S DCA \IZ S 6261 /CDF 60 SZBUF, DCAI 7 S 6211 /CDF COMMON S ISZ 7 S JMP ZBUF C C [IN.3] LOAD BUFFERS FROM BMI MEM=IBM1 IBYTE=IHGH1 C C LOAD BUF(KPTR3)<==KY1 IY=KY1-1 S TAD \KPTR3 S DCA LB1# S TAD (6261 /CDF 60 S DCA LB1 S CALL 2,T3BUF S LB1, ARG LB1 S ARG (2 C C LOAD BUF(KPTR4)<==KY1+1 IY=KY1 S TAD \KPTR4 S DCA LB2# S TAD (6261 /CDF 60 S DCA LB2 S CALL 2,T3BUF S LB2, ARG LB2 S ARG (2 C C LOAD BUF(KPTR5)<==KY1+2 IY=KY1+1 S TAD \KPTR5 S DCA LB3# S TAD (6261 /CDF 60 S DCA LB3 S CALL 2,T3BUF S LB3, ARG LB3 S ARG (2 C S JMP RINITBUFF /OK. C*************************************************** C *PROCEDURE R E A D N E X T B U F C****************************************************** C C C READNEXT THE TRIPLE LINE BUFFER S CPAGE 3 SRREADNEXTBUFF, JMP I READNEXTBUFF S READNEXTBUFF, 0 /ENTRY C C [RNB.1] IF IY1>KY1 IYSAVE=IY C THEN INCREMENT THE RING POINTERS C ELSE INIT POINTERS AND BUFFER AND RETURN; S TAD \IY1 S CIA S TAD \KY1 S SZA CLA S JMP \1810 /> C GO INIT S JMS INITBUF IY=IYSAVE S JMP RREADNEXTBUFF C C ELSE ROTATE BUFFER POINTERS 1810 IZ=KPTR1 KPTR1=KPTR2 KPTR2=KPTR3 KPTR3=KPTR4 KPTR4=KPTR5 KPTR5=IZ C C C [RNB.2] LOAD BUFFER KPTR5 FROM LINE IY1+2 MIN 255; MEM=IBM1 IBYTE=IHGH1 C LOAD BUF(KPTR5)<==MIN(IY1+2,255) IY=IY1+1 IF(IY-256)1811,1820,1820 S\1811, TAD \KPTR5 S DCA LB4# S TAD (6261 /CDF 60 S DCA LB4 S CALL 2,T3BUF S LB4, ARG LB4 S ARG (2 C IY=IYSAVE C C C [RNB.3] LOAD NEXT BUFFER WITH ZEROS S\1820, CLA CMA S TAD \KPTR3 S DCA 11 /AUTOINDEX DO 1821 IX=1,256 S CPAGE 6 S DCA \IZ S 6261 /CDF 60 S DCAI 11 S 6211 /CDF 10 1821 CONTINUE IY=IYSAVE S JMP RREADNEXTBUF S JMP RREADNEXTBUFF /OK. C*************************************************** C *PROCEDURE G E T 5 X 5 C****************************************************** C C C GET THE CURRENT NEIGHBORHOOD IN THE 5-LINE BUFFER C CENTERED AT IX (ZEROS AT END POINTS) INTO Jx,y. S CPAGE 3 SRGET5X5, JMP I GET5X5 S GET5X5, 0 /ENTRY C C C [GET.1] SET THE 5 POINTERS INTO AUTOINDEX REG S CLA CMA S TAD \KPTR1 S DCA 11 C S CLA CMA S TAD \KPTR2 S DCA 12 C S CLA CMA S TAD \KPTR3 S DCA 13 C S CLA CMA S TAD \KPTR4 S DCA 14 C S CLA CMA S TAD \KTR5 S DCA 15 C C C [GET.2] READ THE LINES S CPAGE 15 S DCA \IZ S TADI 11 S DCA 25 S TADI 12 S DCA 26 S TADI 13 S DCA 27 S TADI 14 S DCA 30 S TADI 15 S 6211 S DCA \J15 S TAD 25 S DCA \J11 S TAD 26 S DCA \J12 S TAD 27 S DCA \J13 S TAD 30 S DCA \J14 C S CPAGE 15 S DCA \IZ S TADI 11 S DCA 25 S TADI 12 S DCA 26 S TADI 13 S DCA 27 S TADI 14 S DCA 30 S TADI 15 S 6211 S DCA \J25 S TAD 25 S DCA \J21 S TAD 26 S DCA \J22 S TAD 27 S DCA \J23 S TAD 30 S DCA \J24 C S CPAGE 15 S DCA \IZ S TADI 11 S DCA 25 S TADI 12 S DCA 26 S TADI 13 S DCA 27 S TADI 14 S DCA 30 S TADI 15 S 6211 S DCA \J35 S TAD 25 S DCA \J31 S TAD 26 S DCA \J32 S TAD 27 S DCA \J33 S TAD 30 S DCA \J34 C S CPAGE 15 S DCA \IZ S TADI 11 S DCA 25 S TADI 12 S DCA 26 S TADI 13 S DCA 27 S TADI 14 S DCA 30 S TADI 15 S 6211 S DCA \J45 S TAD 25 S DCA \J41 S TAD 26 S DCA \J42 S TAD 27 S DCA \J43 S TAD 30 S DCA \J44 C S CPAGE 15 S DCA \IZ S TADI 11 S DCA 25 S TADI 12 S DCA 26 S TADI 13 S DCA 27 S TADI 14 S DCA 30 S TADI 15 S 6211 S DCA \J55 S TAD 25 S DCA \J51 S TAD 26 S DCA \J52 S TAD 27 S DCA \J53 S TAD 30 S DCA \J54 C S JMP RGET5X5 C*************************************************** C *PROCEDURE C K O U T C****************************************************** C C C CHECK WHETHER THE OUTPUT BM SPEC IS LEGAL ELSE GOTO 999. S CPAGE 3 SRCKOUT, JMP I CKOUT S CKOUT, 0 /ENTRY C C [1] TEST IF KOUTFILE="BM" S TAD \KOUTFILE S CIA S TAD BMTEXT S SZA CLA S JMP \999 /FAILED C C [2] TEST IF (KOUTFILE(2) LAND '7700)=DIGIT S TAD \KOUTFILE# S BSW S AND (0077 S TAD (-60 /"0" S SPA S JMP \999 /NO, FAILED S TAD (-D8 /"7" TEST S SMA CLA S JMP \999 /FAILED S JMP RCKOUT /OK. C C C*************************************************** C *PROCEDURE C K I N C****************************************************** C C C CHECK WHETHER THE INPUT BM SPEC IS LEGAL ELSE GOTO 999. S CPAGE 3 SRCKIN, JMP I CKIN S CKIN, 0 /ENTRY C C [1] TEST IF BMI1="BM" S TAD \SFILE S CIA S TAD BMTEXT S SZA CLA S JMP \999 /FAILED C C [2] TEST IF (BMI1(2) LAND '7700)=DIGIT S TAD \SFILE# S BSW S AND (0077 S TAD (-60 /"0" S SPA S JMP \999 /NO, FAILED S TAD (-D8 /"7" TEST S SMA CLA S JMP \999 /FAILED S JMP RCKIN /OK. C C C*************************************************** C *PROCEDURE C K I N 2 C****************************************************** C C C CHECK WHETHER THE INPUT BM SPEC IS LEGAL ELSE GOTO 999. S CPAGE 3 SRCKIN2, JMP I CKIN2 S CKIN2, 0 /ENTRY C C [1] CHECK FIRST IBM1 SPEC S JMS CKIN C C C [2] TEST IF BMI2="BM" S TAD \SEXT S CIA S TAD BMTEXT S SZA CLA S JMP \999 /FAILED C C [3] TEST IF (BMI2((6) LAND '7700)=DIGIT S TAD \SEXT# S BSW S AND (0077 S TAD (-60 /"0" S SPA S JMP \999 /NO, FAILED S TAD (-D8 /"7" TEST S SMA CLA S JMP \999 /FAILED S JMP RCKIN2 /OK. C C C************** P A R A M E T E R S ************* J11=0 J12=0 J13=0 J14=0 J15=0 J21=0 J22=0 J23=0 J24=0 J25=0 J31=0 J32=0 J33=0 J34=0 J35=0 J41=0 J42=0 J43=0 J44=0 J45=0 J51=0 J52=0 J53=0 J54=0 J55=0 C IFA=0 IFB=0 IFC=0 IFD=0 IFAP=0 IFBP=0 IFCP=0 IFDP=0 S BMTEXT, TEXT /BM/ END