计算图像的颜色数量

时间:2011-03-01 10:55:55

标签: java image colors

我有三个不同的图像(jpeg或bmp)。 我试图根据每个图像的颜色数来预测每个图像的复杂程度。 我怎么能用Java实现它呢? 谢谢。

更新 这些代码不起作用..输出显示1312种颜色,即使它只是纯红色和白色

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.ArrayList;

import javax.imageio.ImageIO;

public class clutters {
    public static void main(String[] args) throws IOException {

        ArrayList<Color> colors = new ArrayList<Color>();

        BufferedImage image = ImageIO.read(new File("1L.jpg"));    
        int w = image.getWidth();
        int h = image.getHeight();
        for(int y = 0; y < h; y++) {
            for(int x = 0; x < w; x++) {
                int pixel = image.getRGB(x, y);     
                int red   = (pixel & 0x00ff0000) >> 16;
                int green = (pixel & 0x0000ff00) >> 8;
                int blue  =  pixel & 0x000000ff;                    
                Color color = new Color(red,green,blue);     

                //add the first color on array
                if(colors.size()==0)                
                    colors.add(color);          
                //check for redudancy
                else {
                    if(!(colors.contains(color)))
                        colors.add(color);
                }
            }
        }
system.out.printly("There are "+colors.size()+"colors");
    }
}

3 个答案:

答案 0 :(得分:7)

代码基本上是正确的,而过于复杂。您可以简单地使用Set并向其添加int值,因为忽略了现有值。您也不需要计算每种颜色的RGB值,因为int返回的getRGB值本身是唯一的:

Set<Integer> colors = new HashSet<Integer>();
    BufferedImage image = ImageIO.read(new File("test.png"));    
    int w = image.getWidth();
    int h = image.getHeight();
    for(int y = 0; y < h; y++) {
        for(int x = 0; x < w; x++) {
            int pixel = image.getRGB(x, y);     
            colors.add(pixel);
        }
    }
    System.out.println("There are "+colors.size()+" colors");

您获得的“奇怪”颜色数量归因于图像压缩(在您的示例中为JPEG)以及其他原因,如图像编辑软件的抗锯齿。即使您仅以红色和白色进行绘制,生成的图像也可能在边缘上的这两个值之间包含大量颜色。

这意味着代码将返回特定图像中使用的真实颜色计数。您可能还想了解不同的图像文件格式以及无损和有损压缩算法。

答案 1 :(得分:0)

http://download.oracle.com/javase/1.4.2/docs/api/java/awt/image/BufferedImage.html#getRGB%28int,%20int%29

有一个可能有用的getRGB方法。但正如你在本课程中所看到的那样。计算颜色并不是一件容易的事情,因为有各种颜色编码,还有alpha通道可以处理。

答案 2 :(得分:0)

BufferedImage bi=ImageIO.read(...);
bi.getColorModel().getRGB(...);