             .doProjection)
           .getProjection
           .getProcessor)]
-    (condp = (type (first processors))
-      ByteProcessor (.convertToByte float-processor false)
-      ShortProcessor (.convertToShort float-processor false))))
-
-(defn gaussian-blur [processor radius]
+    (convert-to-type-like (first processors))))
+
+(defn gaussian-blur
+  "Applys a gaussian blur to ImageProcessor, with given radius."
+  [processor radius]
   (let [new-proc (.duplicate processor)]
     (.blurGaussian (GaussianBlur.) new-proc radius radius 0.0002)
     new-proc))
+
+(defn normalize
+  "Rescale intensities so the max value of processor is 1.0."
+  [processor]
+  (let [max (.max (.getStatistics processor))
+        float-proc (.convertToFloat processor)]
+    (.multiply float-proc (/ 1 max))
+    float-proc))
+
+(defn divide-processors
+  "Divide processor 1 by processor 2."
+  [proc1 proc2]
+  (-> (ImageCalculator.)
+      (.run 
+        "divide float"
+        (ImagePlus. "" proc1)
+        (ImagePlus. "" proc2))
+      .getProcessor
+      (convert-to-type-like proc1)))
   
 
 ;; testing

  "Converts and ImageJ ImageProcessor to an AWT image."
  [^ImageProcessor proc]
  (.createImage proc))

;; Trimming and displacing images


(ns slide-explorer.image
  (:import (ij CompositeImage IJ ImagePlus ImageStack)
           (ij.io FileSaver)
           (ij.plugin ImageCalculator ZProjector)
           (ij.plugin.filter GaussianBlur)
           (ij.process ByteProcessor LUT ImageProcessor ColorProcessor
                       ImageStatistics ByteStatistics ShortProcessor
                       FloatProcessor)
           (mmcorej TaggedImage)
           (javax.swing JFrame)
           (java.awt Color)
