我怎样才能找到一个图像的主色?(How can i find dominant color of a

2019-06-24 07:50发布

我们可以发现它的颜色是使用Java,ImageMagick的或jmagick图像中占主导地位?

Answer 1:

在Java迭代上的每个像素,并确定色

import java.awt.image.BufferedImage;
import java.io.File;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;


public class ImageTester {


    public static void main(String args[]) throws Exception {
        File file = new File("C:\\Users\\Andrew\\Desktop\\myImage.gif");
        ImageInputStream is = ImageIO.createImageInputStream(file);
        Iterator iter = ImageIO.getImageReaders(is);

        if (!iter.hasNext())
        {
            System.out.println("Cannot load the specified file "+ file);
            System.exit(1);
        }
        ImageReader imageReader = (ImageReader)iter.next();
        imageReader.setInput(is);

        BufferedImage image = imageReader.read(0);

        int height = image.getHeight();
        int width = image.getWidth();

        Map m = new HashMap();
        for(int i=0; i < width ; i++)
        {
            for(int j=0; j < height ; j++)
            {
                int rgb = image.getRGB(i, j);
                int[] rgbArr = getRGBArr(rgb);                
                // Filter out grays....                
                if (!isGray(rgbArr)) {                
                        Integer counter = (Integer) m.get(rgb);   
                        if (counter == null)
                            counter = 0;
                        counter++;                                
                        m.put(rgb, counter);                
                }                
            }
        }        
        String colourHex = getMostCommonColour(m);
        System.out.println(colourHex);
    }


    public static String getMostCommonColour(Map map) {
        List list = new LinkedList(map.entrySet());
        Collections.sort(list, new Comparator() {
              public int compare(Object o1, Object o2) {
                return ((Comparable) ((Map.Entry) (o1)).getValue())
                  .compareTo(((Map.Entry) (o2)).getValue());
              }
        });    
        Map.Entry me = (Map.Entry )list.get(list.size()-1);
        int[] rgb= getRGBArr((Integer)me.getKey());
        return Integer.toHexString(rgb[0])+" "+Integer.toHexString(rgb[1])+" "+Integer.toHexString(rgb[2]);        
    }    

    public static int[] getRGBArr(int pixel) {
        int alpha = (pixel >> 24) & 0xff;
        int red = (pixel >> 16) & 0xff;
        int green = (pixel >> 8) & 0xff;
        int blue = (pixel) & 0xff;
        return new int[]{red,green,blue};

  }
    public static boolean isGray(int[] rgbArr) {
        int rgDiff = rgbArr[0] - rgbArr[1];
        int rbDiff = rgbArr[0] - rgbArr[2];
        // Filter out black, white and grays...... (tolerance within 10 pixels)
        int tolerance = 10;
        if (rgDiff > tolerance || rgDiff < -tolerance) 
            if (rbDiff > tolerance || rbDiff < -tolerance) { 
                return false;
            }                 
        return true;
    }
}


Answer 2:

我刚刚发布了一个很简单的算法,可以在Java平凡翻译。 这就是所谓的彩色取景器和JavaScript的工作。

该线程中提出的解决方案可以通过图像中的几个白色大字被甩出,而我的真正试图找到最突出的颜色,即使所有的像素是不是真的完全一样的颜色。

这里有一个现场演示 。

我们如果发现有用我知道。



Answer 3:

这是一个棘手的问题。 举例来说,如果你有完全一致的颜色和大面积不同的颜色略有不同的色调,然后简单地寻找所使用的大部分颜色的小区域是不太可能给你造成你想要的。 您将通过定义一系列的颜色得到一个更好的结果,对于每个,RGB值,你考虑的范围为“是”那种颜色。

本主题在ImageMagick的话语服务器上详细讨论,例如: http://www.imagemagick.org/discourse-server/viewtopic.php?f=1&t=12878

另见得到的图像的主色的快速方法



Answer 4:

使用普通的Java你可以遍历每个像素,并计算每个颜色如何往往包含...

伪代码:

Map<Color, Integer> color2counter;
for (x : width) {
   for (y : height) {
      color = image.getPixel(x, y)
      occurrences = color2counter.get(color)
      color2counter.put(color, occurrences + 1)
   }
}


Answer 5:

假设你使用添加剂的配色方案,其中(0,0,0)是黑色和(255,255,255)是白色(纠正我,如果我错了)。 另外,如果你只是想找到主色RGB出来的:

一个想法我有,其中任何你可以自由地端详是有3个变量,每个店的RGB值中的一个,并加入到他们每个人的每个像素的相应值的图像中,然后通过除以(255个* numOfPixels)获得颜色的比例。 再对比3比:绿色0.60红色和.5将意味着红色更占优势。

这只是一个想法,可能需要的调整...



Answer 6:

在其他的方式,我们就可以完成这项工作与颜色贼库。 更多信息可以发现这里和这里 。

感谢@svenwoltmann和@lokeshdhakar。



文章来源: How can i find dominant color of an image?