1 /**
2 * Copyright (c) 2011, The University of Southampton and the individual contributors.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without modification,
6 * are permitted provided that the following conditions are met:
7 *
8 * * Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer.
10 *
11 * * Redistributions in binary form must reproduce the above copyright notice,
12 * this list of conditions and the following disclaimer in the documentation
13 * and/or other materials provided with the distribution.
14 *
15 * * Neither the name of the University of Southampton nor the names of its
16 * contributors may be used to endorse or promote products derived from this
17 * software without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
23 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
26 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30 package org.openimaj.image.analysis.algorithm.histogram;
31
32 import org.openimaj.image.FImage;
33 import org.openimaj.image.analyser.ImageAnalyser;
34 import org.openimaj.image.processor.ImageProcessor;
35 import org.openimaj.math.statistics.distribution.Histogram;
36
37 /**
38 * An {@link ImageAnalyser} that processes an image and generates a
39 * {@link Histogram}.
40 * <p>
41 * You can get the histogram for an image like so: <code><pre>
42 * {@code
43 * FImage img = new FImage( ... );
44 * HistogramProcessor hp = new HistogramProcessor( 64 );
45 * img.analyse( hp );
46 * Histogram h = hp.getHistogram();
47 * }
48 * </pre></code>
49 * </p>
50 *
51 * @see FImage#process(ImageProcessor)
52 * @author Jonathon Hare (jsh2@ecs.soton.ac.uk)
53 */
54 public class HistogramAnalyser implements ImageAnalyser<FImage>
55 {
56 /** The number of bins in the histogram */
57 private int nbins;
58
59 /** The histogram being built */
60 private Histogram histogram;
61
62 /**
63 * Default constructor that builds a histogram processor that will create
64 * histograms with the given number of bins.
65 *
66 * @param nbins
67 * The number of bins.
68 */
69 public HistogramAnalyser(int nbins) {
70 this.nbins = nbins;
71 }
72
73 /**
74 * Computes the Histogram for this image. The assumption is that the image
75 * has been normalised to the range 0..1. Values greater than 1 will be
76 * placed in the top bin.
77 *
78 * @param image
79 * The image from which to extract histogram
80 */
81 @Override
82 public void analyseImage(FImage image) {
83 this.histogram = new Histogram(nbins);
84 for (int r = 0; r < image.height; r++)
85 {
86 for (int c = 0; c < image.width; c++)
87 {
88 int bin = (int) (image.pixels[r][c] * nbins);
89 if (bin > (nbins - 1))
90 bin = nbins - 1;
91 histogram.values[bin]++;
92 }
93 }
94 }
95
96 /**
97 * Returns the histogram that was built having run the processing function.
98 * This will return null if the processing has not yet been run.
99 *
100 * @return The {@link Histogram} that was built.
101 */
102 public Histogram getHistogram()
103 {
104 return histogram;
105 }
106
107 /**
108 * Quickly create a histogram from an image.
109 *
110 * @param image
111 * the image
112 * @param nbins
113 * the number of bins per band
114 * @return a histogram
115 */
116 public static Histogram getHistogram(FImage image, int nbins) {
117 final HistogramAnalyser p = new HistogramAnalyser(nbins);
118 image.analyseWith(p);
119 return p.getHistogram();
120 }
121 }