java - 确定图像是否具有特定的色谱

标签 java image colors pixel

我想知道目前是否有用 Java 编写的算法来确定图像中是否包含少量不同的像素颜色。

我正在尝试检测占位符图像(通常由高比例的单色(通常是白色和灰色像素)组成,而不是全彩照片(由多种颜色组成)。

如果什么都不存在,我会自己写一些东西(正在考虑对图像中随机位置的任意像素进行采样或对图像中包含的所有像素颜色进行平均),然后确定我找到的不同颜色的数量。根据所使用的方法,速度和准确性之间可能需要权衡。

任何建议/指示/阅读 Material 表示赞赏。

最佳答案

一种方法是:

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();
    }
}

}

关于java - 确定图像是否具有特定的色谱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10633565/

相关文章:

java - 我收到 BeanFactory 错误 : NoSuchBeanDefinitionException and I can't figure out how to solve it

java - 如何通过 SOAP 消息传递参数以使用 Web 服务的参数化方法

java - 如何在 Amazon Lambda 中提供数据库凭证等配置参数?

java - 如何让 java 对象重写它的方法?

java - 如何为 TableView 的一行着色?

c# - 从 .net 将图像写入每 channel 32 位(每像素 128 位)位图

css - 在 imgur 上托管的 css 上使用背景图片

ios - 使用 uiscrollview 进行图像缩放无法正常工作。 swift

image - 如何访问 OpenCV 中的像素?

android - 如何设置溢出菜单的背景颜色