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.feature.global;
31
32 import org.openimaj.feature.DoubleFV;
33 import org.openimaj.feature.FeatureVectorProvider;
34 import org.openimaj.image.FImage;
35 import org.openimaj.image.MBFImage;
36 import org.openimaj.image.analyser.ImageAnalyser;
37 import org.openimaj.image.mask.AbstractMaskedObject;
38
39 /**
40 * Extract the average brightness of an image. Brightness can be computed in a
41 * number of different ways, depending on the chosen {@link Mode}.
42 *
43 * @author Jonathon Hare (jsh2@ecs.soton.ac.uk)
44 */
45 public class AvgBrightness extends AbstractMaskedObject<FImage>
46 implements
47 ImageAnalyser<MBFImage>,
48 FeatureVectorProvider<DoubleFV>
49 {
50 /**
51 * Modes for computing brightness.
52 *
53 * @author Jonathon Hare (jsh2@ecs.soton.ac.uk)
54 *
55 */
56 public enum Mode {
57 /**
58 * Luminance using the NTSC weighting scheme (equivalent to the Y in the
59 * YUV colour space)
60 */
61 NTSC_LUMINANCE {
62 @Override
63 public double computeBrightness(MBFImage image, FImage mask) {
64 final FImage R = image.getBand(0);
65 final FImage G = image.getBand(1);
66 final FImage B = image.getBand(2);
67
68 double brightness = 0;
69
70 if (mask != null) {
71 for (int y = 0; y < R.height; y++) {
72 for (int x = 0; x < R.width; x++) {
73 if (mask.pixels[y][x] == 1)
74 brightness += (0.299f * R.pixels[y][x] + 0.587f * G.pixels[y][x] + 0.114f * B.pixels[y][x]);
75 }
76 }
77 } else {
78 for (int y = 0; y < R.height; y++)
79 for (int x = 0; x < R.width; x++)
80 brightness += (0.299f * R.pixels[y][x] + 0.587f * G.pixels[y][x] + 0.114f * B.pixels[y][x]);
81 }
82
83 return brightness / (R.height * R.width);
84 }
85 };
86
87 /**
88 * Compute the average brightness of the given image (applying the mask
89 * if it's not <code>null</code>).
90 *
91 * @param img
92 * the image to extract the average brightness from
93 * @param mask
94 * the mask
95 * @return the average brightness
96 */
97 public abstract double computeBrightness(MBFImage img, FImage mask);
98 }
99
100 private Mode mode;
101 private double brightness;
102
103 /**
104 * Construct with the NTSC_LUMINANCE mode and no mask set
105 */
106 public AvgBrightness() {
107 this(Mode.NTSC_LUMINANCE, null);
108 }
109
110 /**
111 * Construct with the given mode and no mask set
112 *
113 * @param mode
114 * the {@link Mode}
115 */
116 public AvgBrightness(Mode mode) {
117 this(mode, null);
118 }
119
120 /**
121 * Construct with the given mode and a mask.
122 *
123 * @param mode
124 * the {@link Mode}
125 * @param mask
126 * the mask.
127 */
128 public AvgBrightness(Mode mode, FImage mask) {
129 super(mask);
130
131 this.mode = mode;
132 }
133
134 @Override
135 public void analyseImage(MBFImage image) {
136 brightness = mode.computeBrightness(image, mask);
137 }
138
139 /**
140 * Get the brightness.
141 *
142 * @return the brightness
143 */
144 public double getBrightness() {
145 return brightness;
146 }
147
148 @Override
149 public DoubleFV getFeatureVector() {
150 return new DoubleFV(new double[] { brightness });
151 }
152 }