package com.github.axet.lookup.common;
import java.awt.image.BufferedImage;
* Container for ImageBinary and Feature class for each channel (rgb channels here)
public class ImageBinaryRGBFeature implements ImageBinaryFeature {
public ImageBinaryChannelFeature r;
public ImageBinaryChannelFeature g;
public ImageBinaryChannelFeature b;
List<ImageBinaryChannelFeature> list;
public ImageBinaryRGBFeature(BufferedImage img, double threshold) {
FeatureSet lr = new FeatureSetAuto(r, threshold);
FeatureSet lg = new FeatureSetAuto(g, threshold);
FeatureSet lb = new FeatureSetAuto(b, threshold);
public void init(BufferedImage img) {
r = new ImageBinaryChannelFeature();
g = new ImageBinaryChannelFeature();
b = new ImageBinaryChannelFeature();
list = Arrays.asList(new ImageBinaryChannelFeature[] { r, g, b });
this.r.initBase(this.image.r);
this.g.initBase(this.image.g);
this.b.initBase(this.image.b);
for (int x = 0; x < this.image.cx; x++) {
for (int y = 0; y < this.image.cy; y++) {
r.zeroMean = new ImageZeroMean();
g.zeroMean = new ImageZeroMean();
b.zeroMean = new ImageZeroMean();
r.zeroMean.init(r.integral);
g.zeroMean.init(g.integral);
b.zeroMean.init(b.integral);
for (int x = 0; x < this.image.cx; x++) {
for (int y = 0; y < this.image.cy; y++) {
r.zeroMeanIntegral = new IntegralImage();
g.zeroMeanIntegral = new IntegralImage();
b.zeroMeanIntegral = new IntegralImage();
r.zeroMeanIntegral.initBase(r.zeroMean);
g.zeroMeanIntegral.initBase(g.zeroMean);
b.zeroMeanIntegral.initBase(b.zeroMean);
for (int x = 0; x < this.image.cx; x++) {
for (int y = 0; y < this.image.cy; y++) {
r.zeroMeanIntegral.step(x, y);
g.zeroMeanIntegral.step(x, y);
b.zeroMeanIntegral.step(x, y);
return image.cx * image.cy;
public BufferedImage getImage() {
public List<ImageBinaryChannelFeature> getFeatureChannels() {