Android二值化算法

77 篇文章 1 订阅
62 篇文章 2 订阅



 
网上找了很多,没有一个能用的,本文的方法是自己在别人的基础上修改而来,纯Java算法,效率没有C++的高,追求效率的可以用Jni,具体参考:http://vaero.blog.51cto.com/4350852/822997 
感谢网上分享的朋友们! 
有图有真相: 





接下来直接上代码: 
Java代码   收藏代码
  1.     public void binarization(Bitmap img) {  
  2.         width = img.getWidth();  
  3.         height = img.getHeight();  
  4.         int area = width * height;  
  5.         int gray[][] = new int[width][height];  
  6.         int average = 0;// 灰度平均值  
  7.         int graysum = 0;  
  8.         int graymean = 0;  
  9.         int grayfrontmean = 0;  
  10.         int graybackmean = 0;  
  11.         int pixelGray;  
  12.         int front = 0;  
  13.         int back = 0;  
  14.         int[] pix = new int[width * height];  
  15.         img.getPixels(pix, 0, width, 00, width, height);  
  16.         for (int i = 1; i < width; i++) { // 不算边界行和列,为避免越界  
  17.             for (int j = 1; j < height; j++) {  
  18.                 int x = j * width + i;  
  19.                 int r = (pix[x] >> 16) & 0xff;  
  20.                 int g = (pix[x] >> 8) & 0xff;  
  21.                 int b = pix[x] & 0xff;  
  22.                 pixelGray = (int) (0.3 * r + 0.59 * g + 0.11 * b);// 计算每个坐标点的灰度  
  23.                 gray[i][j] = (pixelGray << 16) + (pixelGray << 8) + (pixelGray);  
  24.                 graysum += pixelGray;  
  25.             }  
  26.         }  
  27.         graymean = (int) (graysum / area);// 整个图的灰度平均值  
  28.         average = graymean;  
  29. Log.i(TAG,"Average:"+average);  
  30.         for (int i = 0; i < width; i++) // 计算整个图的二值化阈值  
  31.         {  
  32.             for (int j = 0; j < height; j++) {  
  33.                 if (((gray[i][j]) & (0x0000ff)) < graymean) {  
  34.                     graybackmean += ((gray[i][j]) & (0x0000ff));  
  35.                     back++;  
  36.                 } else {  
  37.                     grayfrontmean += ((gray[i][j]) & (0x0000ff));  
  38.                     front++;  
  39.                 }  
  40.             }  
  41.         }  
  42.         int frontvalue = (int) (grayfrontmean / front);// 前景中心  
  43.         int backvalue = (int) (graybackmean / back);// 背景中心  
  44.         float G[] = new float[frontvalue - backvalue + 1];// 方差数组  
  45.         int s = 0;  
  46. Log.i(TAG,"Front:"+front+"**Frontvalue:"+frontvalue+"**Backvalue:"+backvalue);  
  47.         for (int i1 = backvalue; i1 < frontvalue + 1; i1++)// 以前景中心和背景中心为区间采用大津法算法(OTSU算法)  
  48.         {  
  49.             back = 0;  
  50.             front = 0;  
  51.             grayfrontmean = 0;  
  52.             graybackmean = 0;  
  53.             for (int i = 0; i < width; i++) {  
  54.                 for (int j = 0; j < height; j++) {  
  55.                     if (((gray[i][j]) & (0x0000ff)) < (i1 + 1)) {  
  56.                         graybackmean += ((gray[i][j]) & (0x0000ff));  
  57.                         back++;  
  58.                     } else {  
  59.                         grayfrontmean += ((gray[i][j]) & (0x0000ff));  
  60.                         front++;  
  61.                     }  
  62.                 }  
  63.             }  
  64.             grayfrontmean = (int) (grayfrontmean / front);  
  65.             graybackmean = (int) (graybackmean / back);  
  66.             G[s] = (((float) back / area) * (graybackmean - average)  
  67.                     * (graybackmean - average) + ((float) front / area)  
  68.                     * (grayfrontmean - average) * (grayfrontmean - average));  
  69.             s++;  
  70.         }  
  71.         float max = G[0];  
  72.         int index = 0;  
  73.         for (int i = 1; i < frontvalue - backvalue + 1; i++) {  
  74.             if (max < G[i]) {  
  75.                 max = G[i];  
  76.                 index = i;  
  77.             }  
  78.         }  
  79.   
  80.         for (int i = 0; i < width; i++) {  
  81.             for (int j = 0; j < height; j++) {  
  82.                 int in = j * width + i;  
  83.                 if (((gray[i][j]) & (0x0000ff)) < (index + backvalue)) {  
  84.                     pix[in] = Color.rgb(000);  
  85.                 } else {  
  86.                     pix[in] = Color.rgb(255255255);  
  87.                 }  
  88.             }  
  89.         }  
  90.           
  91.         Bitmap temp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);  
  92.         temp.setPixels(pix, 0, width, 00, width, height);  
  93.         image.setImageBitmap(temp);  
  94.     }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值