我想知道當前是否有任何算法用Java編寫,用於確定圖像是否包含其中包含的不同像素顏色的低範圍。確定圖像是否具有特定的色譜
我試圖檢測佔位符圖像(一種典型地由單一顏色高百分比(通常是白色和灰色像素),而不是全綵色照片(即由多個顏色過多)的。
如果什麼都不存在,我會自己寫一些東西(正在考慮對圖像中任意位置的任意像素進行採樣,或者對圖像中包含的所有像素顏色取平均值),然後確定我找到的不同顏色的數量。根據所使用的方法,在速度和準確度之間進行折衷。
任何建議/指針/閱讀材料讚賞。
我想知道當前是否有任何算法用Java編寫,用於確定圖像是否包含其中包含的不同像素顏色的低範圍。確定圖像是否具有特定的色譜
我試圖檢測佔位符圖像(一種典型地由單一顏色高百分比(通常是白色和灰色像素),而不是全綵色照片(即由多個顏色過多)的。
如果什麼都不存在,我會自己寫一些東西(正在考慮對圖像中任意位置的任意像素進行採樣,或者對圖像中包含的所有像素顏色取平均值),然後確定我找到的不同顏色的數量。根據所使用的方法,在速度和準確度之間進行折衷。
任何建議/指針/閱讀材料讚賞。
做的一種方式將是:
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();
}
}
}
簡單的低開銷方法是分別對紅色,綠色和藍色分量值進行直方圖分析。每種顏色只有256個顏色級別,因此效率非常高 - 您可以在new int[256]
陣列中構建每個直方圖。
然後你只指望非零值的數量在每個直方圖,並檢查它們是否都滿足某個閾值(比方說在每個至少20個不同的值將意味着照片)
另一種方法是要在圖像中創建一個HashSet的顏色值,並在掃描圖像時不斷添加到HashSet。由於HashSets擁有唯一的值,它將只存儲不一致的顏色。爲了避免HashSet變得太大,當HashSet的大小達到預定的閾值(可能是1000種獨特的顏色?)並且得出結論,你有一張照片時,你可以保釋出來。
澄清:你想確定圖像中唯一的像素值的數量嗎? –
是的。圖片中唯一的唯一身份代碼會顯示佔位符圖片。更高的百分比更可能是全綵色照片。 – Paul