
C++*********************************************************************
C
C    LOCAL.FOR
C    revised sept 89 al-- didn't work
C    program seems to have been changed in Sept. 86
C    program corrected to be compilable (but not tested) 7/30/87 M.R.
C **********************************************************************
C=* FROM: SPIDER - MODULAR IMAGE PROCESSING SYSTEM.   AUTHOR: J.FRANK  *
C=* Copyright (C) 1985-2005  Health Research Inc.                      *
C=*                                                                    *
C=* HEALTH RESEARCH INCORPORATED (HRI),                                *   
C=* ONE UNIVERSITY PLACE, RENSSELAER, NY 12144-3455.                   *
C=*                                                                    *
C=* Email:  spider@wadsworth.org                                       *
C=*                                                                    *
C=* This program is free software; you can redistribute it and/or      *
C=* modify it under the terms of the GNU General Public License as     *
C=* published by the Free Software Foundation; either version 2 of the *
C=* License, or (at your option) any later version.                    *
C=*                                                                    *
C=* This program is distributed in the hope that it will be useful,    *
C=* but WITHOUT ANY WARRANTY; without even the implied warranty of     *
C=* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  *
C=* General Public License for more details.                           *
C=*                                                                    *
C=* You should have received a copy of the GNU General Public License  *
C=* along with this program; if not, write to the                      *
C=* Free Software Foundation, Inc.,                                    *
C=* 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.      *
C=*                                                                    *
C **********************************************************************
C
C      LOCAL:   CONTRAST ENHANCEMENT BASED ON LOCAL HISTOGRAM INFORMATION
C             J.FRANK JULY 1977
C
C      CALL LOCAL(LUN1,LUN2,NSAM,NROW)
C        LUN1       LOGICAL UNIT NUMBER OF FILE
C        LUN2       LOGICAL UNIT NUMBER OF FILE
C        NSAM,NROW  DIMENSIONS OF FILE
C
C  VARIABLES:   NLOCAL     LOCAL EQUALIZATION AREA
C               KCTR1,2    STARTING & ENDING COLUMNS
C               ICTR1,2    STARTING & ENDING ROWS
C               A1         NO. PIXELS IN LOCAL AREA
C               IM         POINTER TO BUFFER POSITION OF ROW START
C               MAP        POISTION OF CURRENT PIXEL IN HISTOGRAM
C               NPTR       ARRAY OF POINTERS TO ROW POSITION IN B0
C          
C--*******************************************************************

      SUBROUTINE LOCAL(LUN1,LUN2,NSAM,NROW,NSLICE)

      
      INCLUDE 'CMBLOCK.INC'

      COMMON       H(256), NPTR(64), B0(1)

      PARAMETER    (NLMAX = 64)
      CHARACTER    ANS,NULL
      INTEGER      A1

      NULL=CHAR(0)

      CALL RDPRMC(ANS,NC,.TRUE.,
     &     '(G)ENERALIZED HISTOGRAM OR (T)HRESHOLD',NULL,IRT)
      IF (IRT .NE. 0) RETURN

      CALL RDPRMI(NLOCAL,NDUM,NOT_USED,'LOCAL AREA SIZE')

      NLM = NLMAX
      IF (NLOCAL .GT. NLM) THEN
         WRITE(NOUT,11) NLM,NLM
11       FORMAT(' MAXIMUM AREA SIZE: ',I2,' * ',I2,'  ASSUMED')
         NLOCAL = NLM
      ENDIF

      NLH = NLOCAL/2
      IF (IMAMI .NE. 1) CALL NORM3(LUN1,NSAM,NROW,NSLICE,FMAX,FMIN,AV)

      NL1   = NLH + 1
      ICTR1 = NL1
      KCTR1 = NL1
      ICTR2 = NROW*NSLICE-NL1
      ICTR3 = ICTR2+1
      KCTR2 = NSAM-NL1
      A1    = NLOCAL*NSAM
      FNALL = NLOCAL**2
      SCAL  = 2./FNALL
      HINCR = (FMAX-FMIN)/127.

C     TEMPORARY CLEARING OF UPPER AND LOWER MARGIN  BECAUSE OF 
C     DISCREPANCY OF NORMALIZATION

      DO  K = 1,A1 + NSAM
         B0(K) = 0.
      ENDDO
      DO  I = 1,NLH
         CALL WRTLIN(LUN2,B0,NSAM,I)
      ENDDO

C     INITIALIZE LHIST
      MODE = 0
      CALL LHIST(B0,NSAM,NLOCAL,KCTR,NPTR,H,MODE)
      IF (MODE.NE.0) RETURN

C     INITIALIZE MREAD
      CALL MREAD(-1,B0,NSAM,NLOCAL,NPTR)

      IF (ANS .NE. 'T') THEN
C       LOCAL GENERALIZED HISTOGRAM OPERATION

        DO  ICTR = ICTR1,ICTR2
C         SWITCH LHIST TO NON-INCREMENTAL OPERATION WITH INTEGRATION
          MODE = 3

C         READ NLOCAL LINES INTO B0
          CALL MREAD(LUN1,B0,NSAM,NLOCAL,NPTR)

          IM = (NPTR(NL1)-1)*NSAM
          DO  KCTR = KCTR1,KCTR2
            CALL LHIST(B0,NSAM,NLOCAL,KCTR,NPTR,H,MODE)

C           SWITCH LHIST TO INCREMENTAL OPERATION WITH INTEGRATION
            MODE = 4

C           NOW APPLY MAPPING TO EACH PIXEL FROM KCTR1...KCTR2
            MAP = (B0(IM+KCTR)-FMIN)/HINCR+1.5
            B0(A1+KCTR) = H(128+MAP)*SCAL
	  ENDDO

C         WRITE THIS ROW TO OUTPUT FILE
          CALL WRTLIN(LUN2,B0(A1+1),NSAM,ICTR)
	ENDDO

      ELSE


        CALL RDPRM(PERC,NOT_USED,'HISTOGRAM THRESHOLD PERCENTAGE$')
        THRESH = FNALL * PERC/100.
        DO  ICTR = ICTR1,ICTR2
          MODE = 1

C         SWITCH LHIST TO NON-INCREMENTAL OPERATION
          CALL MREAD(LUN1,B0,NSAM,NLOCAL,NPTR)
          IM = (NPTR(NL1)-1)*NSAM

          DO  KCTR = KCTR1,KCTR2
            CALL LHIST(B0,NSAM,NLOCAL,KCTR,NPTR,H,MODE)

C           SWITCH LHIST TO INCREMENTAL OPERATION
            MODE = 2

            DO  L = 1,128
              IF (H(L) .GT. THRESH) GOTO 86
	    ENDDO

86          IF (FLOAT(L)*HINCR.LT.B0(IM+KCTR)-FMIN) B0(A1+KCTR) = 2.
	  ENDDO
          CALL WRTLIN(LUN2,B0(A1+1),NSAM,ICTR)
	ENDDO
      ENDIF


C     BORDER CLEARING. 
      DO  K = 1,NSAM
        B0(K) = 0.
      ENDDO

      DO  I = ICTR3,NROW*NSLICE
        CALL WRTLIN(LUN2,B0,NSAM,I)
      ENDDO

      IMAMI = 0
      SIG   = -1.
      FMAX  = 2.
      FMIN  = 0.
      CALL SETPRM(LUN2,NSAM,NROW,FMAX,FMIN,AV,'U')

      END

