annotate src/rlm/image_utils.clj @ 0:78a630e650d2

initial import
author Robert McIntyre <rlm@mit.edu>
date Tue, 18 Oct 2011 00:57:08 -0700
parents
children
rev   line source
rlm@0 1 (ns rlm.image-utils
rlm@0 2 (:import [javax.swing JFrame]
rlm@0 3 [java.awt Color BorderLayout]
rlm@0 4 [ij ImagePlus IJ]
rlm@0 5 [java.lang Math]
rlm@0 6 [java.awt Graphics2D Panel]
rlm@0 7 [ij Macro]
rlm@0 8 [java.io BufferedReader InputStreamReader]
rlm@0 9 [java.awt.image BufferedImage])
rlm@0 10 (:use [clojure.contrib
rlm@0 11 [math]
rlm@0 12 [def]]))
rlm@0 13
rlm@0 14
rlm@0 15 (defmulti frame-hash-multi class)
rlm@0 16
rlm@0 17 (defmethod frame-hash-multi ImagePlus
rlm@0 18 [image+]
rlm@0 19 (with-meta
rlm@0 20 (let [buf (.. image+ getBufferedImage)
rlm@0 21 color (.getColorModel buf)]
rlm@0 22 (apply hash-map
rlm@0 23 (interleave
rlm@0 24 (doall (for [x (range (.getWidth image+)) y (range (.getHeight image+))]
rlm@0 25 (vector x y)))
rlm@0 26 (doall (for [x (range (.getWidth image+)) y (range (.getHeight image+))]
rlm@0 27 (let [data (.getRGB buf x y)]
rlm@0 28 (hash-map :r (bit-shift-right (bit-and 0xff0000 data) 16)
rlm@0 29 :g (bit-shift-right (bit-and 0x00ff00 data) 8)
rlm@0 30 :b (bit-and 0x0000ff data))))))))
rlm@0 31 {:width (.getWidth image+) :height (.getHeight image+)}))
rlm@0 32
rlm@0 33 (defmethod frame-hash-multi String
rlm@0 34 [image-name]
rlm@0 35 (let [image+ (ImagePlus. image-name)]
rlm@0 36 (frame-hash-multi image+)))
rlm@0 37
rlm@0 38 (defn frame-hash
rlm@0 39 "yields a convienent representation for the pixles in an image.
rlm@0 40 Because of the size of the structvre generated, this must only be used
rlm@0 41 in a transient way so that java can do it's garbage collection."
rlm@0 42 [something]
rlm@0 43 (frame-hash-multi something))
rlm@0 44
rlm@0 45
rlm@0 46 (def white {:r 255, :g 255, :b 255})
rlm@0 47 (def black {:r 0, :g 0, :b 0})
rlm@0 48
rlm@0 49 (defn rgb-euclidian
rlm@0 50 [{r1 :r g1 :g b1 :b} {r2 :r g2 :g b2 :b} ]
rlm@0 51 (expt (+ (expt (- r1 r2) 2)
rlm@0 52 (expt (- g1 g2) 2)
rlm@0 53 (expt (- b1 b2) 2)) 0.5))
rlm@0 54
rlm@0 55 (defn b&w
rlm@0 56 "turn everything strictly black or white"
rlm@0 57 [window]
rlm@0 58 (with-meta
rlm@0 59 (zipmap
rlm@0 60 (keys window)
rlm@0 61 (map (fn [rgb]
rlm@0 62 (if (> (rgb-euclidian rgb white) (rgb-euclidian rgb black))
rlm@0 63 black white))
rlm@0 64 (vals window))) (meta window)))
rlm@0 65
rlm@0 66 (defn frame-hash->bufferedImage
rlm@0 67 [frame-hash]
rlm@0 68 (let [data (meta frame-hash)
rlm@0 69 image (BufferedImage. (:width data) (:height data) BufferedImage/TYPE_INT_BGR)]
rlm@0 70
rlm@0 71 (doall (for [element frame-hash]
rlm@0 72 (let [coord (key element)
rlm@0 73 rgb (val element)
rlm@0 74 packed-RGB
rlm@0 75 (+ (bit-shift-left (:r rgb) 16)
rlm@0 76 (bit-shift-left (:g rgb) 8)
rlm@0 77 (:b rgb))]
rlm@0 78 (.setRGB image (first coord) (last coord) packed-RGB))))
rlm@0 79 image))
rlm@0 80
rlm@0 81 (defmulti display "Creates a JFrame and displays a buffered image" class)
rlm@0 82
rlm@0 83 (defn- makePanel [image]
rlm@0 84 (proxy [Panel] [] (paint [g] (.drawImage g image 0 0 nil))))
rlm@0 85
rlm@0 86 (defmethod display
rlm@0 87 BufferedImage [image]
rlm@0 88 (let [panel (makePanel image)
rlm@0 89 frame (JFrame. "Oh Yeah!")]
rlm@0 90 (.add frame panel)
rlm@0 91 (.pack frame)
rlm@0 92 (.setVisible frame true )
rlm@0 93 (.setSize frame(.getWidth image) (.getHeight image))))
rlm@0 94
rlm@0 95 (defmethod display
rlm@0 96 ImagePlus [image]
rlm@0 97 (display (.getBufferedImage image)))
rlm@0 98
rlm@0 99 (defmethod display
rlm@0 100 clojure.lang.PersistentHashMap [frame-hash]
rlm@0 101 (display (frame-hash->bufferedImage frame-hash)))
rlm@0 102
rlm@0 103 (defmethod display
rlm@0 104 clojure.lang.PersistentArrayMap [frame-hash]
rlm@0 105 (display (frame-hash->bufferedImage frame-hash)))
rlm@0 106
rlm@0 107 (defn rotate [degrees #^ImagePlus image]
rlm@0 108 (.rotate (.getChannelProcessor image) degrees)
rlm@0 109 image)
rlm@0 110
rlm@0 111
rlm@0 112 (defn-memo width [pic]
rlm@0 113 (inc (first (last (sort (fn [[x0 y0] [x1 y1]] (> x1 x0)) (keys pic))))))
rlm@0 114
rlm@0 115 (defn-memo height [pic]
rlm@0 116 (inc (last (last (sort (fn [[x0 y0] [x1 y1]] (> y1 y0)) (keys pic))))))
rlm@0 117