<> <> <<>> DIRECTORY AIS, Hist, Real, Rope; HistImpl: CEDAR PROGRAM IMPORTS AIS, Real EXPORTS Hist = BEGIN OPEN Hist; Calc: PUBLIC PROC [filename:Rope.ROPE, low,high: NAT] RETURNS [histogram: Histogram] ~ { Buffer: TYPE = REF BufferRec; BufferRec: TYPE = PACKED ARRAY [0..2048) OF [0..255]; fdIn: AIS.FRef; wIn: AIS.WRef; rIn:AIS.Raster; buffer:Buffer _ NEW[BufferRec]; counts: ARRAY[0..255] OF LONG CARDINAL _ ALL[0]; nPixels:REAL _ 0; histogram _ NEW[HistogramRec]; fdIn _ AIS.OpenFile[name:filename]; wIn _ AIS.OpenWindow[fdIn]; rIn _ AIS.ReadRaster[fdIn]; FOR line: NAT IN [0.. rIn.scanCount) DO TRUSTED { AIS.UnsafeReadLine[w:wIn, buffer:[length:rIn.scanLength, addr:LOOPHOLE[buffer]], line:line] }; FOR pixel: NAT IN [0..rIn.scanLength) DO IF buffer[pixel] IN [low..high] THEN { nPixels _ nPixels + 1; counts[buffer[pixel]] _ counts[buffer[pixel]] + 1; } ENDLOOP; ENDLOOP; FOR i: NAT IN [0..255] DO histogram[i] _ counts[i]/nPixels; ENDLOOP; AIS.CloseWindow[wIn]; AIS.CloseFile[fdIn]; }; Equalize: PUBLIC PROC [histogram: Histogram] RETURNS [trcVec: TRCVec] ~ { currentFraction: REAL _ 0; trcVec _ NEW[TRCVecRec]; FOR i: NAT IN [0..255] DO currentFraction _ currentFraction + histogram[i]; trcVec[i].out _ MIN[Real.RoundC[currentFraction*256], 255]; trcVec[i].pinned _ FALSE; ENDLOOP; }; END.