zoukankan      html  css  js  c++  java
  • 图像二值化处理Java

    二值化基本概念:通俗的讲就是把一副彩色图像处理成一副黑白图像,一般是作为后续复杂图像处理操作的预处理。

    二值化算法思路:遍历图像的所有像素点,计算每个像素点的灰度值。通过迭代法收敛得到一个最佳阈值,灰度值大于最佳阈值的像素点设为白色,灰度值小于最佳阈值的像素点设为黑色。(我这里的二值化处理结果是,背景是白色,前景是黑色)

    迭代法获取最佳阈值思路:

    1.设最小灰度值为Gmin,最大灰度值为Gmax,阈值初始化为T(0)=(Gmin+Gmax)/2。

    2.以阈值T(k)将图像分割为前景和背景,求出整个前景像素的平均灰度值Gf和整个背景像素的平均灰度值Gb,此时阈值T(k)=(Gf+Gb)/2 (k=0,1,2...);

    3.若此时T(k)=T(k+1),那么此时收敛,得到最佳阈值。否则回到步骤2,直到阈值收敛到某一个值。

     1 public class Binary {
     2     public static int[] getBinaryImg(int w, int h, int[] inputs) {
     3         int[] gray = new int[w * h];
     4         int[] newpixel = new int[w * h];
     5         for (int index = 0; index < w * h; index++) {
     6             int red = (inputs[index] & 0x00FF0000) >> 16;
     7             int green = (inputs[index] & 0x0000FF00) >> 8;
     8             int blue = inputs[index] & 0x000000FF;
     9             gray[index] = (int) ((float) red * 0.3 + (float) green * 0.59 + (float) blue * 0.11);
    10         }
    11         //求出最大灰度值zmax和最小灰度值zmin
    12         int Gmax = gray[0], Gmin = gray[0];
    13         for (int index = 0; index < w * h; index++) {
    14             if (gray[index] > Gmax) {
    15                 Gmax = gray[index];
    16             }
    17             if (gray[index] < Gmin) {
    18                 Gmin = gray[index];
    19             }
    20         }
    21 
    22         //获取灰度直方图
    23         int i, j, t, count1 = 0, count2 = 0, sum1 = 0, sum2 = 0;
    24         int bp, fp;
    25         int[] histogram = new int[256];
    26         for (t = Gmin; t <= Gmax; t++) {
    27             for (int index = 0; index < w * h; index++) {
    28                 if (gray[index] == t)
    29                     histogram[t]++;
    30             }
    31         }
    32 
    33         /*
    34         * 迭代法求出最佳分割阈值
    35         * */
    36         int T = 0;
    37         int newT = (Gmax + Gmin) / 2;//初始阈值
    38         while (T != newT)
    39         //求出背景和前景的平均灰度值bp和fp
    40         {
    41             for (i = 0; i < T; i++) {
    42                 count1 += histogram[i];//背景像素点的总个数
    43                 sum1 += histogram[i] * i;//背景像素点的灰度总值
    44             }
    45             bp = (count1 == 0) ? 0 : (sum1 / count1);//背景像素点的平均灰度值
    46 
    47             for (j = i; j < histogram.length; j++) {
    48                 count2 += histogram[j];//前景像素点的总个数
    49                 sum2 += histogram[j] * j;//前景像素点的灰度总值
    50             }
    51             fp = (count2 == 0) ? 0 : (sum2 / count2);//前景像素点的平均灰度值
    52             T = newT;
    53             newT = (bp + fp) / 2;
    54         }
    55         int finestYzt = newT; //最佳阈值
    56 
    57         //二值化
    58         for (int index = 0; index < w * h; index++) {
    59             if (gray[index] > finestYzt)
    60                 newpixel[index] = Color.WHITE;
    61             else newpixel[index] = Color.BLACK;
    62         }
    63         return newpixel;
    64     }
    65 }
  • 相关阅读:
    科普下病菌和病毒
    centos环境下安装docker
    change master to到一个不存在的主库或主库无法连接
    java.lang.outofmemoryerror android
    委托 C#
    将PC端的网站转化成手机端网站需要增加以下这段代码即可,再布局一下界面即可
    combobox联动
    删除dataGridview中选中的一行或多行
    vs2010下如何使【“System.Data.OracleClient.OracleConnection”已过时】 解决办法
    MyEclipse连接SQL Server 2008数据库的操作方法
  • 原文地址:https://www.cnblogs.com/gxclmx/p/6916515.html
Copyright © 2011-2022 走看看