C PROGRAM SEGMRG.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 SEGMRG.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 *_SEGMRG,,(lower sizing R1, upper sizing R2), C (Optional Threshold t) - segment BMi into BMj C connected component image in two passes removing objects C whose area is outside C of [R1:R2]. The optional range of [R1:R2]=[2:2047]. C The optional thresold is used to slice the image C in the creation of the initial binary image (default=1). C The algorithm is given as follows: C C [1] _Scale(SLICE,,t,255) to 0/1 binary image. C Remove isolated pixels during binary image generation. C C [2] Initialize the mapping and feature arrays C mtop_255; C For i_0 Step 1 Until 255 Do C Begin C mavail[i]_i; C map[i]_i; C mfrom[i]_0; C mto[i]_0; C marea[i]_0; C lcuraccessed[i]_0; C End; C C [3] Zero the border of the image window. C For x_kx1 Step 1 Until kx2 Do C Begin C BMj[x,ky1]_0; C BMj[x,ky2]_0; C End; C For y_ky1 Step 1 Until ky2 Do C Begin C BMj[kx1,y]_0; C BMj[kx2,y]_0; C End; C C [4] Perform initial first pass labeling; C mem_BMj; C line<==GETLINE(ky1); C For y_ky1+1 Step 1 Until ky2-1 Do C Begin "process line" C lastline<==line; C line<==GETLINE(y); C lstaccessed<==lcuraccessed; C C [4.1] Process each pixel as state transition function; C For x_kx1+1 Step 1 Until kx2-1 Do C Begin "process pixel" C If 000 "Start new CCy A.1" C 01X C XXX and SUM x Geq 0 C Then C If (mtop_mtop-1) < 2 C Then HALT -- blew stack C Else Y_mavail[mtop], C lcuraccessed[Y]_1, C 000 C 0YX C XXX, map[Y]_y, marea[y]_1, C C ElseIf --- "Horizontal extension b.1" C Y1- and (Y > 1) C Then --- C YY-, marea[Y]_marea[Y]+1, C lcuraccessed[Y]_1 C C ElseIf Y-- "Next row propagate c.1" C 01- and (Y > 1) C Then Y-- C 0Y-, marea[Y]_marea[Y]+1, C lcuraccessed[Y]_1 C C ElseIf 0Y- "Next row propagate c.2" C 01- and (Y > 1) C Then 0Y- C 0Y-, marea[Y]_marea[Y]+1, C lcuraccessed[Y]_1 C ElseIf 00Y "Next row propagate c.3" C 01- and (Y > 1) C Then 00Y C 0Y-, marea[Y]_marea[Y]+1, C lcuraccessed[Y]_1 C ElseIf -0Z "Merge detection d.1" C Y1- and (Y > 1) and (Z > 1) and (Y neq Z) C Then -0Z C YY-, map[Z]_Y, marea[Y]_marea[Y]+1, C lcuraccessed[Y]_1; C End "process pixel"; C C [4.2] Test for termination of any CC. C For i_0 Step 1 Until 255 Do C If (lstaccessed[i]=1) and (lcuraccessed[i]=0) C Then C Begin "Terminate last CCi" C "Compute total area by assigning C transitive closure of Y components C to marea[y]." C C "test if free it" C If not(R1 Leq marea[Y] Leq R2) C Then C Begin "Free Y CC's" C For k_0 Step 1 Until 255 Do C If map[k]=Y C Then mavail[mtop_mtop+1]_Y; C End "Free Y CC's"; C End "Terminate last CCi"; C End "process line"; 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 [0] INITIALIZATION C [0.1] INITIALIZATION WRITE(1,995) WRITE(3,995) 995 FORMAT(' SEGMRG 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 [0.3] DEFINE THE AREA SCALE FACTOR MICRONS/PIXEL. C DEFINE SCALE FACTOR CALL BMAP(LENS,ZOOM,PUC,UNAME) C C [1] SEGMENT THE IMAGE 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 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 ************* S BMTEXT, TEXT /BM/ END