2011-03-01 16 views
6

मेरे पास तीन अलग-अलग छवियां हैं (जेपीईजी या बीएमपी)। मैं प्रत्येक के रंग की संख्या के आधार पर प्रत्येक छवि की जटिलता की भविष्यवाणी करने की कोशिश कर रहा हूं। मैं जावा के साथ इसे कैसे संभव बना सकता हूं? धन्यवाद।छवियों के रंगों की संख्या की गणना करें

अद्यतन: ये कोड काम नहीं करता है .. उत्पादन से पता चलता 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"); 
    } 
} 
+0

क्या ग्रेस्केल छवि (केवल 256 रंगों के साथ) में रंगीन छवि छवि की तुलना में कम जटिलता है जिसमें 65,536 रंग हैं? –

+0

जो आप निर्माण करने की कोशिश कर रहे हैं उसे हिस्टोग्राम कहा जाता है। – djdanlib

उत्तर

7

कोड मूल रूप से सही है, जबकि बहुत जटिल है। आप बस Set का उपयोग कर सकते हैं और int मान जोड़ सकते हैं, क्योंकि मौजूदा मानों को अनदेखा किया जाता है। तुम भी, प्रत्येक रंग के लिए आरजीबी मूल्यों की गणना करने की जरूरत नहीं है के रूप में 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"); 

"अजीब" रंग आप छवि संपीड़न बकाया है हो रही है की संख्या (आपके उदाहरण में जेपीईजी) और शायद अन्य कारणों से आपके छवि संपादन सॉफ्टवेयर के एंटी-एलाइजिंग। यहां तक ​​कि यदि आप केवल लाल और सफेद रंग में पेंट करते हैं, तो परिणामी छवि में किनारों पर इन दो मानों के बीच बहुत सारे रंग हो सकते हैं।

इसका मतलब है कि कोड वास्तविक किसी विशेष छवि में उपयोग किए गए रंगों की गणना करेगा। आप विभिन्न छवि फ़ाइल स्वरूपों और हानि रहित और हानिकारक संपीड़न एल्गोरिदम पर भी एक नज़र रखना चाहते हैं।

+0

धन्यवाद क्रिस :) – Jessy

0

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

एक getRGB विधि है कि उपयोगी हो सकता है है। लेकिन जैसा कि आप इस कक्षा में देख सकते हैं। रंगों की गिनती एक छोटी सी चीजें नहीं हैं क्योंकि विभिन्न प्रकार के रंग कोडिंग हैं और इसके साथ निपटने के लिए अल्फा चैनल भी हैं।

संबंधित मुद्दे