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