0

画像に含まれるさまざまなピクセルカラーの範囲が狭いかどうかを判断するために、現在Javaで記述されているアルゴリズムがあるかどうか疑問に思っています。

フルカラーの写真(多数の複数の色で構成されている)ではなく、プレースホルダー画像(通常は単色(通常は白と灰色のピクセル)の割合が高い)を検出しようとしています。

何も存在しない場合は、自分で何かを書き(画像全体のランダムな位置で任意のピクセルをサンプリングするか、画像全体に含まれるすべてのピクセルの色を平均化することを考えていました)、見つけたさまざまな色の量を決定します。使用する方法によっては、速度と精度の間にトレードオフが生じる場合があります。

アドバイス/ポインタ/読み物をいただければ幸いです。

4

2 に答える 2

1

単純な低オーバーヘッドのアプローチは、赤、緑、青のコンポーネント値のヒストグラムを個別に作成することです。それぞれのカラー レベルは 256 しかないため、非常に効率的です。各ヒストグラムをnew int[256]配列に作成できます。

次に、各ヒストグラムのゼロ以外の値の数を数え、それらがすべて何らかのしきい値を満たしているかどうかを確認します (それぞれの値が少なくとも 20 個ある場合は写真を意味するとします)。

別のアプローチは、画像内の色値の HashSet を作成し、画像をスキャンしながら HashSet に追加し続けることです。HashSet は一意の値を保持するため、一意の色のみを格納します。HashSet が大きくなりすぎないようにするために、HashSet のサイズが事前に決められたしきい値 (おそらく 1000 個の一意の色) に達したときに救済し、写真があると結論付けることができます。

于 2012-05-17T10:28:46.573 に答える
1

それを行う方法は次のとおりです。

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

Histogram クラスを提供するため、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();
    }
}

}

于 2012-05-17T10:51:16.733 に答える