Advertisement
Jecao

Otsu Filter

Nov 18th, 2016
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.08 KB | None | 0 0
  1. package projeto.imagem;
  2.  
  3. public class OtsuFilter {
  4.  
  5.     public double getOtsuThreshold(int[] grayScaleValues) {
  6.  
  7.         int[] n = getHistograma(grayScaleValues);
  8.         double[] p = getProbabilidades(n, grayScaleValues.length);
  9.         double[] Wo = getWo(p);
  10.         double W = getW(p);
  11.         double[] W1 = getW1(Wo, W);
  12.         double UT = getUT(p);
  13.         double[] Ut = getUt(p);
  14.         double[] Uo = getUo(Ut, Wo);
  15.         double[] U1 = getU1(UT, Ut, Uo);
  16.         double sigmaSqrT = getSigmaSqrT(UT, p);
  17.         double[] sigmaSqrBt = getSigmaSqrBt(Wo, W1, U1, Uo);
  18.         double[] eta = getEta(sigmaSqrBt, sigmaSqrT);
  19.  
  20.         return getMaxIndex(eta);
  21.  
  22.     }
  23.  
  24.     private int[] getHistograma(int[] grayScaleValues) {
  25.         int[] histograma = new int[256];
  26.  
  27.         for (int i = 0; i < grayScaleValues.length; i++) {
  28.             histograma[grayScaleValues[i]]++;
  29.         }
  30.         return histograma;
  31.     }
  32.  
  33.     private double[] getProbabilidades(int[] histograma, int totalPixels) {
  34.  
  35.         double[] probabilidade = new double[histograma.length];
  36.  
  37.         for (int i = 0; i < probabilidade.length; i++) {
  38.             probabilidade[i] = ((double) histograma[i]) / ((double) totalPixels);
  39.         }
  40.  
  41.         return probabilidade;
  42.     }
  43.  
  44.     private double[] getWo(double[] probabilidade) {
  45.  
  46.         double[] Wo = new double[probabilidade.length];
  47.         Wo[0] = probabilidade[0];
  48.  
  49.         for (int i = 1; i < Wo.length; i++) {
  50.             Wo[i] = Wo[i - 1] + probabilidade[i];
  51.         }
  52.  
  53.         return Wo;
  54.     }
  55.  
  56.     private double getW(double[] probabilidade) {
  57.  
  58.         double W = 0;
  59.  
  60.         for (int i = 0; i < probabilidade.length; i++) {
  61.             W += probabilidade[i];
  62.         }
  63.  
  64.         return W;
  65.     }
  66.  
  67.     private double[] getW1(double[] Wo, double W) {
  68.  
  69.         double[] W1 = new double[Wo.length];
  70.  
  71.         for (int i = 0; i < W1.length; i++) {
  72.             W1[i] = W - Wo[i];
  73.         }
  74.  
  75.         return W1;
  76.     }
  77.  
  78.     private double getUT(double[] probabilidade) {
  79.  
  80.         double UT = 0;
  81.  
  82.         for (int i = 0; i < probabilidade.length; i++) {
  83.             UT += (((double) i) * probabilidade[i]);
  84.         }
  85.  
  86.         return UT;
  87.  
  88.     }
  89.  
  90.     private double[] getUt(double[] probabilidade) {
  91.  
  92.         double[] Ut = new double[probabilidade.length];
  93.  
  94.         Ut[0] = 0;
  95.         for (int i= 1; i < probabilidade.length; i++) {
  96.             Ut[i] = Ut[i - 1] + (((double) i) * probabilidade[i]);
  97.         }
  98.  
  99.         return Ut;
  100.     }
  101.  
  102.     private double[] getUo(double[] Ut, double[] Wo) {
  103.  
  104.         double[] Uo = new double[Ut.length];
  105.  
  106.         for (int i = 0; i < Ut.length; i++) {
  107.             Uo[i] = Ut[i] / Wo[i];
  108.         }
  109.  
  110.         return Uo;
  111.  
  112.     }
  113.  
  114.     private double[] getU1(double UT, double[] Ut, double[] Uo) {
  115.  
  116.         double[] U1 = new double[Ut.length];
  117.  
  118.         for (int i = 0; i < U1.length; i++) {
  119.             U1[i] = (UT - Ut[i]) / (1 - Uo[i]);
  120.         }
  121.  
  122.         return U1;
  123.  
  124.     }
  125.  
  126.     private double getSigmaSqrT(double UT, double[] probability) {
  127.  
  128.         double sigmaSqrT = 0;
  129.  
  130.         for (int i = 0; i < probability.length; i++) {
  131.             sigmaSqrT += (Math.pow((i - UT), 2) * probability[i]);
  132.         }
  133.  
  134.         return sigmaSqrT;
  135.  
  136.     }
  137.  
  138.     private double[] getSigmaSqrBt(double[] Wo, double[] W1, double[] U1, double[] Uo) {
  139.         double sigmaSqrBt[] = new double[Wo.length];
  140.  
  141.         for (int i = 0; i < sigmaSqrBt.length; i++) {
  142.             sigmaSqrBt[i] = Wo[i] * W1[i] * Math.pow((U1[i] - Uo[i]), 2);
  143.         }
  144.  
  145.         return sigmaSqrBt;
  146.     }
  147.  
  148.     private int getMaxIndex(double[] array) {
  149.  
  150.         int maxI = 0;
  151.         for (int i = 0; i < array.length; i++) {
  152.             if (array[maxI] < array[i]) {
  153.                 maxI = i;
  154.             }
  155.         }
  156.         return maxI;
  157.  
  158.     }
  159.  
  160.     private double[] getEta(double[] sigmaSqrBt, double sigmaSqrT) {
  161.         double eta[] = new double[sigmaSqrBt.length];
  162.         for (int i = 0; i < sigmaSqrBt.length; i++) {
  163.             eta[i] = sigmaSqrBt[i] / sigmaSqrT;
  164.         }
  165.         return eta;
  166.     }
  167. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement