2012-05-17 79 views
0

我想知道當前是否有任何算法用Java編寫,用於確定圖像是否包含其中包含的不同像素顏色的低範圍。確定圖像是否具有特定的色譜

我試圖檢測佔位符圖像(一種典型地由單一顏色高百分比(通常是白色和灰色像素),而不是全綵色照片(即由多個顏色過多)的。

如果什麼都不存在,我會自己寫一些東西(正在考慮對圖像中任意位置的任意像素進行採樣,或者對圖像中包含的所有像素顏色取平均值),然後確定我找到的不同顏色的數量。根據所使用的方法,在速度和準確度之間進行折衷。

任何建議/指針/閱讀材料讚賞。

+0

澄清:你想確定圖像中唯一的像素值的數量嗎? –

+0

是的。圖片中唯一的唯一身份代碼會顯示佔位符圖片。更高的百分比更可能是全綵色照片。 – Paul

回答

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 

您還可以使用Java高級圖像(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(); 
    } 
} 

}

1

簡單的低開銷方法是分別對紅色,綠色和藍色分量值進行直方圖分析。每種顏色只有256個顏色級別,因此效率非常高 - 您可以在new int[256]陣列中構建每個直方圖。

然後你只指望非零值的數量在每個直方圖,並檢查它們是否都滿足某個閾值(比方說在每個至少20個不同的值將意味着照片)

另一種方法是要在圖像中創建一個HashSet的顏色值,並在掃描圖像時不斷添加到HashSet。由於HashSets擁有唯一的值,它將只存儲不一致的顏色。爲了避免HashSet變得太大,當HashSet的大小達到預定的閾值(可能是1000種獨特的顏色?)並且得出結論,你有一張照片時,你可以保釋出來。

相關問題