天天看點

andrid圖像處理系統1.3.0圖像的直方圖均衡

最終版源代碼:​​https://github.com/nuptboyzhb/AndroidImageProSystem​​

圖像處理結果:

andrid圖像處理系統1.3.0圖像的直方圖均衡
/*
   *直方圖均衡化 
   */
  public Bitmap histEqualize(Bitmap myBitmap){
    // Create new array
      int width = myBitmap.getWidth();
      int height = myBitmap.getHeight();
      int[] pix = new int[width * height];
      myBitmap.getPixels(pix, 0, width, 0, 0, width, height);
      Matrix dataR=getDataR(pix, width, height);
      Matrix dataG=getDataG(pix, width, height);
      Matrix dataB=getDataB(pix, width, height);
      //Matrix dataGray=getDataGray(pix, width, height);
      /
      dataR=eachEqualize(dataR,width,height);
      dataG=eachEqualize(dataG,width,height);
      dataB=eachEqualize(dataB,width,height);
      ///
      // Change bitmap to use new array
      Bitmap bitmap=makeToBitmap(dataR, dataG, dataB, width, height);  
      myBitmap = null;
      pix = null;
      return bitmap;
  }
  private Matrix eachEqualize(Matrix temp,int width,int height){
    // 灰階映射表
    int  bMap[]=new int[256];
    // 灰階映射表
    int lCount[]=new int[256];
    // 重置計數為0
    int i,j;
    for (i = 0; i < 256; i ++){
      // 清零
      lCount[i] = 0;
    }
    // 計算各個灰階值的計數 - 參考灰階直方圖的繪制代碼 (對話框類中)
    for (i = 0; i < height; i ++){
      for (j = 0; j < width; j ++){
          lCount[(int)temp.get(i, j)]++;  // 計數加1
      }
    }
    // 計算灰階映射表
    for (i = 0; i < 256; i++){
      // 初始為0
      int Temp = 0;
      for (j = 0; j <= i ; j++){
        Temp += lCount[j];
      }
      // 計算對應的新灰階值
      bMap[i] = (int) (Temp * 255 / height / width);
    }
    // 每行
    for (i = 0; i < height; i++){
      // 每列
      for (j = 0; j < width; j++){
          temp.set(i, j, bMap[(int)temp.get(i,j)]);
      }
    }
    return temp; 
  }