我想知道目前是否有用Java编写的算法用于确定图像中是否包含低范围的不同像素颜色。
我正在尝试检测占位符图像(通常包含高百分比的单色(通常是白色和灰色像素),而不是全彩色照片(由多种颜色组成)。
如果不存在,我会自己写一些东西(考虑在整个图像中随机位置采样任意像素或平均显示图像中包含的所有像素颜色),然后确定我找到的不同颜色的数量。根据所使用的方法,速度和准确度之间可能存在折衷。
任何建议/指针/阅读材料都很受欢迎。
答案 0 :(得分:1)
一种简单的低开销方法是分别对红色,绿色和蓝色分量值进行直方图。每个只有256个颜色级别,因此它非常有效 - 您可以在new int[256]
数组中构建每个直方图。
然后你只计算每个直方图中的非零值的数量,并检查它们是否都满足某个阈值(假设每个值中至少有20个不同的值意味着照片)
另一种方法是在图像中创建颜色值的HashSet,并在扫描图像时继续添加到HashSet。由于HashSets包含唯一值,因此它仅存储不重要的颜色。为了避免HashSet变得太大,你可以在HashSet的大小达到预定的阈值(可能是1000种独特的颜色?)时纾困,并得出你有照片的结论。
答案 1 :(得分: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 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();
}
}
}