2012-05-10 10 views

答えて

7
各ピクセル上の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; 
    } 
} 
1

あなただけの各画素を反復し、各色が含まれている頻度を数えることができる、プレーン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) 
    } 
} 
0

ここで、(0,0,0)は黒、(255,255,255)は白です(私が間違っている場合は修正してください)。また、RGBの主要な色を探したいだけなら:

私が持っている一つのアイデアは、あなたが自由に調べることができる3つの変数をそれぞれRGB値の1つを格納し、それらに画像内のすべてのピクセルの適切な値を設定し、次に(255 * numOfPixels)で除算して色の比率を取得します。次に、3つの比率を比較します。赤色は.60、緑色は.5は赤がより優勢であることを意味します。

これは単なるアイデアで、微調整が必​​要になる場合があります...

+0

私は色をRGBタイプとして使用するjamagickを使用しましたが、この方法で私は画像のavarage clorを見つけることができます。しかし、私はミドルのイメージを切り抜けることができるというアイデアを持っているので、私は同じ色をもう一度与える部分の平均色を見つけることができます。私は支配的な色のみを見つけます:/ –

+0

@ErçinAkçay画像をトリミングする場合は、必ず境界線にメインカラーが欲しいです。例えばあなたは白く囲まれた大きな広場を持っていると言います。正方形ではなく白い色を検出したいのです。 –

4

これはトリッキーな問題があります。たとえば、まったく同じ色の小さな領域と、異なる色のわずかに異なる色合いの広い領域がある場合、最も使用されている色を探しているだけで、結果が得られない可能性があります。あなたは、色のセットを定義することによって、より良い結果を得るでしょう、そしてそれぞれ、その色になると考えるRGB値の範囲。

このトピックは、ImageMagickの談話サーバー上の長さで議論されている、例えば: http://www.imagemagick.org/discourse-server/viewtopic.php?f=1&t=12878

も参照してくださいFast way of getting the dominant color of an image

6

私は自明Javaで翻訳することができる非常に単純なアルゴリズムをリリースしました。 color-finderと呼ばれ、JavaScriptで動作します。

このスレッドで提案されている解決策は、画像内のいくつかの白い文字で捨てることができますが、すべてのピクセルが本当に正確に同じ色ではない場合でも、鉱山は最も顕著な色を見つけようとします。

Here is a live demo

あなたが役に立ったら教えてください。

1

他の方法で、私たちはColor Thiefライブラリでこの仕事をすることができます。詳細はherehereです。 @svenwoltmannと@lokeshdhakarする

クレジット。