图像二值化处理Java
Posted 萌虾
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图像二值化处理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 }
以上是关于图像二值化处理Java的主要内容,如果未能解决你的问题,请参考以下文章
为啥用二值化处理图像之后,还会有其他的灰度值,尤其是在一些边缘的位置。比如opencv里的cvThreshold