Java: 2-мерный массив с компонентами цвета и интервалом гистограммы - PullRequest
1 голос
/ 06 апреля 2011

Я создал метод, который должен отображать гистограмму из изображения ... У меня есть двухмерный массив:

int[][] myHistogram=new int[colorComponentOfImage][bin256];  

чем я начал читать информацию о пикселях и извлекать цвет следующим образом:

int pixel[]=new int[width*height];
myImage.getRGB(0,0,width,height,pv,0,width);

Теперь, как я могу заполнить массив цветами, которые я получаю из изображения ??? или я извлекаю неправильно цвета ??

спасибо заранее

p.s. это остальная часть кода (метод для заполнения массива гистограммы):

public void setHistogram(int[][] myHistogram) {
    this.hist = myHistogram;
    for (int i = 0; i < this.bin256; i++) {
        for (int j = 0; j < this.colorcomponents; j++) {
            this.max = (this.max > this.hist[j][i]) ? this.max : this.hist[j][i];
        }
    }
}

и это метод построения гистограммы:

public BufferedImage plotHistogram(int width, int height) {

    BufferedImage image = null;



    if (this.colorcomponents >= 3) {
        /**
         * extended RGB algorithm first channel:red second channel: green
         * third channel: blue fourth channel: the alpha value is being
         * ignored
         */
        image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics2D graphics = image.createGraphics();

        Polygon[] poly = new Polygon[3];

        graphics.setColor(Color.white);
        graphics.fillRect(0, 0, width, height);

        /**
         * only first three bands are used
         */
        for (int i = 0; i < 3; i++) {
            poly[i] = new Polygon();
            if (i == RED) {
                graphics.setColor(Color.red);
            }

            else if (i == GREEN) {
                graphics.setColor(Color.green);
            }

            else if (i == BLUE) {
                graphics.setColor(Color.blue);
            }

            float xInterval = (float) width / (float) bins;
            float yInterval = (float) height / (float) max;
            poly[i].addPoint(0, height);

            for (int j = 0; j < bins; j++) {
                int x = (int) ((float) j * xInterval);
                int y = (int) ((float) this.hist[i][j] * yInterval);

                poly[i].addPoint(x, height - y);
            }

            poly[i].addPoint(width, height);
            graphics.fill(poly[i]);
        }

        Area red = new Area(poly[RED]);
        Area green = new Area(poly[GREEN]);
        Area blue = new Area(poly[BLUE]);

        red.intersect(green);
        green.intersect(blue);
        blue.intersect(new Area(poly[0]));

        graphics.setColor(new Color(255, 255, 0));
        graphics.fill(red);

        graphics.setColor(new Color(0, 255, 255));
        graphics.fill(green);

        graphics.setColor(new Color(255, 0, 255));
        graphics.fill(blue);

        graphics.setColor(Color.black);
        blue.intersect(new Area(poly[2]));
        graphics.fill(blue);
    }
    return image;
}

если я вызываю plotHistogram, массив Hist пуст ...

Ответы [ 2 ]

2 голосов
/ 06 апреля 2011

Честно говоря, я не прочитал вашу plotHistogram, но в моем понимании myHistogram будет иметь 3 или 4 массива, каждый из которых содержит еще один массив с 256 элементами в нем.Каждый из них является счетчиком, который должен быть инициализирован с 0s.

Затем вы определяете следующие 4 константы:

final int RED_CHANNEL = 0;
final int BLUE_CHANNEL = 1;
final int GREEN_CHANNEL = 2;
final int ALPHA_CHANNEL = 3;

... // затем на каждом пикселе вы даете значенияна красный, зеленый, синий и увеличиваем соответствующий счетчик.

myHistogram[RED_CHANNEL][red]++;
myHistogram[GREEN_CHANNEL][green]++;

и т. д. *

Когда вы обработали все изображение, у вас должна быть гистограмма в массиве myHistogram.

Кстати: вместо этого:

  if (i == RED) {
    graphics.setColor(Color.red);
  } else if (i == GREEN) {
    graphics.setColor(Color.green);
  }else if (i == BLUE) {
    graphics.setColor(Color.blue);
  }

Я бы определил массив цветов, например

`final Color [] plotColours = new Colors [] {Color.RED, Color.GREEN, Color.BLUE};

и чем вы можете

graphics.setColor(plotColours[i]);

, откуда я иду:

/**
* only first three bands are used
*/
for (int i = 0; i < 3; i++) { ...
0 голосов
/ 06 апреля 2011

Хорошо.Как я понимаю, ваш myImage - BufferedImage. Здесь полезен Javadoc из BufferedImage. Как я понимаю, этот метод возвращает ровно ширина * высота количество целых чисел.Каждое целое число содержит информацию об одном пикселе.Это возможно, потому что они сдвигают (с помощью оператора >>) значения RGBA в одно значение int.поэтому, чтобы извлечь точный RGBA, вы должны сделать что-то вроде:

int alpha = ((rgb >> 24) & 0xff); 
int red = ((rgb >> 16) & 0xff); 
int green = ((rgb >> 8) & 0xff); 
int blue = ((rgb ) & 0xff); 

, где rgb - это одно целое число из массива, возвращаемого myImage.getRGB(...);

Возможно, вам следует рассмотреть возможностьgetRGB (int x, int y) и обработайте возвращенные значения int, как описано выше.

Понятно или я был слишком многословен ???:)

...