Advertisement
Guest User

Untitled

a guest
Feb 27th, 2015
236
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.29 KB | None | 0 0
  1. package main;
  2.  
  3. import java.io.File;
  4. import java.io.FileInputStream;
  5. import java.util.ArrayList;
  6. import java.util.Random;
  7.  
  8. import javafx.scene.image.Image;
  9. import javafx.scene.image.WritablePixelFormat;
  10.  
  11. public class Main {
  12.    
  13.     private class Color {
  14.         private double r;
  15.         private double g;
  16.         private double b;
  17.        
  18.         public Color(double r_, double g_, double b_) {
  19.             r = r_;
  20.             g = g_;
  21.             b = b_;
  22.         }
  23.        
  24.         public double getR() {
  25.             return r;
  26.         }
  27.        
  28.         public double getG() {
  29.             return g;
  30.         }
  31.        
  32.         public double getB() {
  33.             return b;
  34.         }
  35.        
  36.         public double euclidean(Color c) {
  37.             return Math.sqrt(Math.pow(getR() - c.getR(), 2) +
  38.                              Math.pow(getG() - c.getG(), 2) +
  39.                              Math.pow(getB() - c.getB(), 2));
  40.         }
  41.        
  42.         public String toString() {
  43.             return (int)r + " " + (int)g + " " + (int)b;
  44.         }
  45.        
  46.     }
  47.    
  48.     private int[] pixels;
  49.     private final int k = 10; //numero de clusters
  50.     private ArrayList<Color>[] clusters;
  51.     private ArrayList<Color> clusterCenters;
  52.    
  53.     @SuppressWarnings("unchecked")
  54.     public Main() {
  55.         clusterCenters = new ArrayList<Color>();
  56.         clusters = new ArrayList[k];
  57.         for (int i = 0; i < k; i++) {
  58.             clusters[i] = new ArrayList<Color>();
  59.         }
  60.        
  61.         loadImage("./res/dress.png");
  62.         classifyPixels();
  63.     }
  64.    
  65.     public void loadImage(String path) {
  66.         try {
  67.             FileInputStream fs = new FileInputStream(new File(path));
  68.             Image image = new Image(fs);
  69.             int[] prePixels = new int[(int) image.getWidth() * (int) image.getHeight()];
  70.             image.getPixelReader().getPixels(0, 0, (int) image.getWidth(), (int) image.getHeight(), WritablePixelFormat.getIntArgbInstance(), prePixels, 0, (int) image.getWidth());
  71.            
  72.             ArrayList<Integer> preBuffer = new ArrayList<Integer>();
  73.             for (int i = 0; i < prePixels.length; i++) {
  74.                 if (getColorFromInt(prePixels[i]).euclidean(new Color(0xff, 0x00, 0xff)) == 0) {
  75.                     continue;
  76.                 }
  77.                
  78.                 preBuffer.add(prePixels[i]);
  79.             }
  80.            
  81.             pixels = new int[preBuffer.size()];
  82.            
  83.             for (int i = 0; i < pixels.length; i++)  {
  84.                 pixels[i] = preBuffer.get(i);
  85.             }
  86.         } catch (Exception e) {
  87.             e.printStackTrace();
  88.         }
  89.     }
  90.    
  91.     public Color getColorFromInt(int i) {
  92.         int r = (int) ((i >> 16) & 0xff);
  93.         int g = (int) ((i >> 8) & 0xff);
  94.         int b = (int) ((i) & 0xff);
  95.        
  96.         return new Color(r, g, b);
  97.     }
  98.    
  99.     public void randomizeClusters() {
  100.         Random random = new Random();
  101.        
  102.         for (int i = 0; i < k; i++) {
  103.             clusterCenters.add(getColorFromInt(pixels[random.nextInt(pixels.length)]));
  104.         }
  105.     }
  106.    
  107.     public Color calculateCenter(ArrayList<Color> colors) {
  108.         double total = 0;
  109.         int totalr = 0;
  110.         int totalg = 0;
  111.         int totalb = 0;
  112.        
  113.         for (Color c : colors) {
  114.             total++;
  115.             totalr += c.getR();
  116.             totalg += c.getG();
  117.             totalb += c.getB();
  118.         }
  119.        
  120.         return new Color((totalr/total), (totalg/total), (totalb/total));
  121.     }
  122.    
  123.     public int smallestDouble(double[] array) {
  124.         double value = Double.MAX_VALUE;
  125.         int index = 100;
  126.        
  127.         for (int i = 0; i < array.length; i++) {
  128.             if (array[i] < value) {
  129.                 value = array[i];
  130.                 index = i;
  131.             }
  132.         }
  133.        
  134.         return index;
  135.     }
  136.    
  137.     public void classifyPixels() {
  138.         randomizeClusters();
  139.        
  140.         double tolerance = 0.001;
  141.         double[] centerDistances = new double[k];
  142.         boolean stop = false;
  143.        
  144.         while (!stop) {
  145.             double[] pixelDistances = new double[k];
  146.            
  147.             for (Integer i : pixels) {
  148.                 Color pixelColor = getColorFromInt(i);
  149.                
  150.                 for (int j = 0; j < k; j++) {
  151.                     pixelDistances[j] = pixelColor.euclidean(clusterCenters.get(j));                   
  152.                 }
  153.                
  154.                 int closest = smallestDouble(pixelDistances);
  155.                
  156.                 clusters[closest].add(pixelColor);
  157.             }
  158.  
  159.             ArrayList<Color> newCenters = new ArrayList<Color>();
  160.            
  161.             for (int i = 0; i < clusters.length; i++) {
  162.                 Color c = calculateCenter(clusters[i]);
  163.                 centerDistances[i] = c.euclidean(clusterCenters.get(i));
  164.                 newCenters.add(c);
  165.             }
  166.            
  167.             clusterCenters = newCenters;
  168.            
  169.             stop = true;
  170.            
  171.             for (int i = 0; i < centerDistances.length; i++) {
  172.                 if (centerDistances[i] >= tolerance) {
  173.                     stop = false;
  174.                 }
  175.             }
  176.            
  177.             for (int i = 0; i < clusters.length; i++) {
  178.                 clusters[i].clear();
  179.             }
  180.         }
  181.        
  182.         for (int i = 0; i < clusterCenters.size(); i++) {
  183.             System.out.println(clusterCenters.get(i));
  184.         }
  185.     }
  186.    
  187.     public static void main(String[] args) {
  188.         new Main();
  189.     }
  190.    
  191. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement