2012-05-10 3 views

답변

7
각 픽셀에 자바 반복 처리에

를 결정 색상

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

그냥 각 픽셀을 반복하고 각 색상이 포함 된 빈도를 셀 수 일반 자바를 사용하여 ...

의사 코드 :

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의 지배적 인 색을 찾고 싶다면 :

당신이 조사 할 자유로운 아이디어 하나 하나는 각각 RGB 값 중 하나를 저장하고 각 RGB 값을 저장하는 3 가지 변수를 갖는 것입니다. 그들에게 이미지의 모든 픽셀의 적절한 값을 입력 한 다음 (255 * numOfPixels)로 나눠 색상의 비율을 얻습니다. 그런 다음 3 가지 비율을 비교하십시오 : 빨간색은 .60, 녹색은 .560은 빨간색이 더 우세함을 의미합니다.

이 그냥 생각하고, 조정해야 할 수도 있습니다 ...

+0

jamagick을 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

난 그냥 하찮게 자바로 번역 될 수있는 매우 간단한 알고리즘을 발표 참조하십시오. color-finder라고하며 JavaScript로 작동합니다.

이 스레드에서 제안 된 솔루션은 이미지의 몇 가지 흰색 문자로 표시 될 수 있지만 모든 픽셀이 실제로 정확히 동일한 색상이 아니더라도 실제로 가장 눈에 띄는 색상을 찾으려고합니다.

Here is a live demo.

유용한 정보가 있으면 알려주세요.

1

다른 방법으로, Color Thief 라이브러리에서이 작업을 수행 할 수 있습니다. 자세한 내용은 herehere입니다.

@svenwoltmann 및 @lokeshdhakar에 대한 크레디트.

관련 문제