Определение того, имеет ли изображение определенный цветовой спектр

Мне интересно, есть ли какие-либо алгоритмы, написанные на Java в настоящее время для определения того, имеет ли изображение низкий диапазон различных цветов пикселей, содержащихся в нем.

Я пытаюсь обнаружить изображения-заполнители (которые обычно состоят из большого процента отдельных цветов (обычно белых и серых пикселей), в отличие от полноцветных фотографий (состоящих из множества нескольких цветов).

Если ничего не существует, я напишу что-нибудь сам (думал о выборке произвольных пикселей в случайных позициях на изображении или усреднении всех цветов пикселей, содержащихся в изображении), а затем определяю количество различных цветов, которые я нахожу. В зависимости от используемой методологии может быть компромисс между скоростью и точностью.

Любые советы / указатели / материалы для чтения приветствуются.


person Squiggs.    schedule 17.05.2012    source источник
comment
Чтобы уточнить: вы хотите определить количество уникальных значений пикселей в изображении?   -  person Oliver Charlesworth    schedule 17.05.2012
comment
Да. низкий процент уникальных изображений будет указывать на изображение-заполнитель. Более высокий процент, скорее всего, будет полноцветными фотографиями.   -  person Squiggs.    schedule 17.05.2012


Ответы (2)


Способ сделать это:

final BufferedImage image = // your image;
final Set<Integer> colours = new HashSet<Integer>();

for (int x = 0; x < image.getWidth(); x++) {
  for (int y = 0; y < image.getHeight(); y++) {
    colours.add(image.getRGB(x, y));
  }
}

// Check your pixels here. In grayscale images the R equals G equals B

Вы также можете использовать Java Advanced Imaging (JAI), поскольку он предоставляет класс гистограммы:

package com.datroop.histogram;

import java.awt.image.renderable.ParameterBlock;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Arrays;

import javax.media.jai.Histogram;
import javax.media.jai.JAI;
import javax.media.jai.PlanarImage;
import javax.media.jai.ROI;
import javax.media.jai.RenderedOp;

public class HistogramCreator {

private HistogramCreator() {        
}

public static int[] createHistogram(final PlanarImage image) {
    // set up the histogram
    final int[] bins = { 256 };
    final double[] low = { 0.0D };
    final double[] high = { 256.0D };

    Histogram histogram = new Histogram(bins, low, high);

    final ParameterBlock pb = new ParameterBlock();

    pb.addSource(image);
    pb.add(null);
    pb.add(1);
    pb.add(1);

    final RenderedOp op = JAI.create("histogram", pb);
    histogram = (Histogram) op.getProperty("histogram");

    // get histogram contents
    final int[] local_array = new int[histogram.getNumBins(0)];

    for (int i = 0; i < histogram.getNumBins(0); i++) {
        local_array[i] = histogram.getBinSize(0, i);
    }

    return local_array;
}

public static void main(String[] args) {
    try {
        String filename = "file://localhost/C:/myimage.jpg";
        System.setProperty("com.sun.media.jai.disableMediaLib", "true");
        // Create the histogram
        int[] myHistogram = createHistogram(JAI.create("url", new URL(filename)));
        // Check it out here
        System.out.println(Arrays.toString(myHistogram));
    } catch (MalformedURLException e) {
        e.printStackTrace();
    }
}

}

person Timmo    schedule 17.05.2012

Простым подходом с низкими накладными расходами было бы построение гистограммы значений красного, зеленого и синего компонентов по отдельности. Для каждого было бы только 256 цветовых уровней, поэтому это было бы довольно эффективно - вы могли бы построить каждую гистограмму в массиве new int[256].

Затем вы просто подсчитываете количество ненулевых значений в каждой из гистограмм и проверяете, все ли они соответствуют некоторому порогу (скажем, по крайней мере 20 различных значений в каждой подразумевают фотографию)

Альтернативным подходом может быть создание HashSet значений цвета в изображении и постоянное добавление в HashSet по мере сканирования изображения. Поскольку HashSet содержит уникальные значения, в нем будут храниться только уникальные цвета. Чтобы HashSet не стал слишком большим, вы можете выйти из него, когда размер HashSet достигнет заранее определенного порога (может быть, 1000 уникальных цветов?) и сделать вывод, что у вас есть фотография.

person mikera    schedule 17.05.2012