基于Java对图片进行二值化处理
发布时间:2021-05-21 05:07:12 所属栏目:大数据 来源: https://www.jb51.cc
导读:一直以来对Java的图形处理能力表无力,但好像又不是那么一回事,之前用PHP做过一些应用,涉及到验证码的识别,其中有个图片二值化的步骤,今天换成Java来实现下 在java的扩展包 javax.imageio 中为我们提供了一个类叫 ImageIO ,这个类提供了一些执行简单编码
一直以来对Java的图形处理能力表无力,但好像又不是那么一回事,之前用PHP做过一些应用,涉及到验证码的识别,其中有个图片二值化的步骤,今天换成Java来实现下 在java的扩展包javax.imageio中为我们提供了一个类叫ImageIO,这个类提供了一些执行简单编码和解码的静态便捷方法,具体说明大家可以翻下API看看 ? 下面来说下关于图片二值化的原理: 1、首先要获取每个像素点的灰度值。 2、定义一个阀值。 3、将每个像素点的灰度值和它周围的8个像素点的灰度值相叠加再除以9,然后和阀值进行比较。 4、大于阀值则设为黑色,小雨则为白色。 ? 下面贴下具体代码,注释很全
1 import java.awt.Color; 2 java.awt.image.BufferedImage; 3 java.io.File; 4 java.io.IOException; 5 6 javax.imageio.ImageIO; 7 8 public class ImageTest { 9 10 static void main(String[] args) throws IOException { 11 String filename = "D:" + File.separator + "/123.jpg";// separator是File里的一个常量,由于java历史遗留问题故为小写 12 File file = new File(filename); 13 BufferedImage bi = ImageIO.read(file); 14 获取当前图片的高,宽,ARGB 15 int h = bi.getHeight(); 16 int w = bi.getWidth(); 17 int rgb = bi.getRGB(0,0); 18 int arr[][] = new int[w][h]; 19 20 获取图片每一像素点的灰度值 21 for (int i = 0; i < w; i++) { 22 int j = 0; j < h; j++23 getRGB()返回默认的RGB颜色模型(十进制) 24 arr[i][j] = getImageRgb(bi.getRGB(i,j));该点的灰度值 25 } 26 27 } 28 29 BufferedImage bufferedImage=new BufferedImage(w,h,BufferedImage.TYPE_BYTE_BINARY); 构造一个类型为预定义图像类型之一的 BufferedImage,TYPE_BYTE_BINARY(表示一个不透明的以字节打包的 1、2 或 4 位图像。) 30 int FZ=130; 31 32 33 if(getGray(arr,i,j,w,h)>FZ){ 34 int black=new Color(255,255).getRGB(); 35 bufferedImage.setRGB(i,black); 36 }else{ 37 int white=new Color(0,1)">38 39 } 40 41 42 43 ImageIO.write(bufferedImage,"jpg",new File("D:"+File.separator+"new123.jpg")); 44 } 45 46 private int getImageRgb( i) { 47 String argb = Integer.toHexString(i); 将十进制的颜色值转为十六进制 48 argb分别代表透明,红,绿,蓝 分别占16进制2位 49 int r = Integer.parseInt(argb.substring(2,4),16);后面参数为使用进制 50 int g = Integer.parseInt(argb.substring(4,6),1651 int b = Integer.parseInt(argb.substring(6,8),1)">52 int result=(int)((r+g+b)/353 return result; 54 55 56 57 58 自己加周围8个灰度值再除以9,算出其相对灰度值 59 int getGray(int gray[][],1)">int x,1)">int y,1)">int w,1)"> h) 60 { 61 int rs = gray[x][y] 62 + (x == 0 ? 255 : gray[x - 1][y]) 63 + (x == 0 || y == 0 ? 255 : gray[x - 1][y - 1]) 64 + (x == 0 || y == h - 1 ? 255 : gray[x - 1][y + 165 + (y == 0 ? 255 : gray[x][y - 166 + (y == h - 1 ? 255 : gray[x][y + 167 + (x == w - 1 ? 255 : gray[x + 1][ y]) 68 + (x == w - 1 || y == 0 ? 255 : gray[x + 1][y - 169 + (x == w - 1 || y == h - 1 ? 255 : gray[x + 1][y + 1]); 70 return rs / 9; 71 } 72 } 看下效果吧: ? (编辑:北几岛) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |