一直以来对Java的图形处理能力表无力,但好像又不是那么一回事,之前用PHP做过一些应用,涉及到验证码的识别,其中有个图片二值化的步骤,今天换成Java来实现下

在java的扩展包javax.imageio中为我们提供了一个类叫ImageIO,这个类提供了一些执行简单编码和解码的静态便捷方法,具体说明大家可以翻下API看看

下面来说下关于图片二值化的原理:

1、首先要获取每个像素点的灰度值。

2、定义一个阀值。

3、将每个像素点的灰度值和它周围的8个像素点的灰度值相叠加再除以9,然后和阀值进行比较。

4、大于阀值则设为黑色,小雨则为白色。

下面贴下具体代码,注释很全

  • separator是File类的一个常量,因年代久远的关系,那时候的代码规范没有和现在一样,常量必须大写,属于历史遗留问题,不必太纠结(建议使用separator而不是"/",便于跨平台) 。
  • BufferedImage里的getRGB得到的是一个ARGB,A代表透明,R代表红色,G代表绿色,B代表蓝色。
  • 包装类Integer里的parseInt方法,第二个可选参数为"要处理几进制的数"。
  • 关于阀值,网上有许多算法,有兴趣的朋友可以自己研究下,这里我随机给出了一个中间数130。
  • 关于图片的灰度值,这里使用简单的(R+G+B)/3。
  1. import java.awt.Color;
  2. import java.awt.image.BufferedImage;
  3. import java.io.File;
  4. import java.io.IOException;
  5.  
  6. import javax.imageio.ImageIO;
  7.  
  8. public class ImageTest {
  9.  
  10. public 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. for (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. for (int i = 0; i < w; i++) {
  32. for (int j = 0; j < h; j++) {
  33. if(getGray(arr,i,j,w,h)>FZ){
  34. int black=new Color(255,255,255).getRGB();
  35. bufferedImage.setRGB(i, j, black);
  36. }else{
  37. int white=new Color(0,0,0).getRGB();
  38. bufferedImage.setRGB(i, j, white);
  39. }
  40. }
  41.  
  42. }
  43. ImageIO.write(bufferedImage, "jpg", new File("D:"+File.separator+"new123.jpg"));
  44. }
  45.  
  46. private static int getImageRgb(int 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),16);
  51. int b = Integer.parseInt(argb.substring(6, 8),16);
  52. int result=(int)((r+g+b)/3);
  53. return result;
  54. }
  55.  
  56. //自己加周围8个灰度值再除以9,算出其相对灰度值
  57. public static int getGray(int gray[][], int x, int y, int w, int h)
  58. {
  59. int rs = gray[x][y]
  60. + (x == 0 ? 255 : gray[x - 1][y])
  61. + (x == 0 || y == 0 ? 255 : gray[x - 1][y - 1])
  62. + (x == 0 || y == h - 1 ? 255 : gray[x - 1][y + 1])
  63. + (y == 0 ? 255 : gray[x][y - 1])
  64. + (y == h - 1 ? 255 : gray[x][y + 1])
  65. + (x == w - 1 ? 255 : gray[x + 1][ y])
  66. + (x == w - 1 || y == 0 ? 255 : gray[x + 1][y - 1])
  67. + (x == w - 1 || y == h - 1 ? 255 : gray[x + 1][y + 1]);
  68. return rs / 9;
  69. }
  70. }

看下效果吧:

基于Java对图片进行二值化处理的更多相关文章

  1. Java 对二值化图片识别连通域

    用Java 对 已经 二值化了的图片 标记连通域 每块的连通域都标记不一样的数字 public static void main(String [] args) throws IOException ...

  2. 图像处理------基于Otsu阈值二值化

    一:基本原理 该方法是图像二值化处理常见方法之一,在Matlab与OpenCV中均有实现. Otsu Threshing方法是一种基于寻找合适阈值实现二值化的方法,其最重 要的部分是寻找图像二值化阈值 ...

  3. Mac中opencv批量对图片进行二值化

    对灰度图像进行二值化,传入的图片是手写汉字的截图,通过二值化把字的部分提出来.用ostu进行二值化 #include <stdio.h> #include <iostream> ...

  4. 深度学习实践-强化学习-bird游戏 1.np.stack(表示进行拼接操作) 2.cv2.resize(进行图像的压缩操作) 3.cv2.cvtColor(进行图片颜色的转换) 4.cv2.threshold(进行图片的二值化操作) 5.random.sample(样本的随机抽取)

    1. np.stack((x_t, x_t, x_t, x_t), axis=2)  将图片进行串接的操作,使得图片的维度为[80, 80, 4] 参数说明: (x_t, x_t, x_t, x_t) ...

  5. 机器学习进阶-项目实战-信用卡数字识别 1.cv2.findContour(找出轮廓) 2.cv2.boudingRect(轮廓外接矩阵位置) 3.cv2.threshold(图片二值化操作) 4.cv2.MORPH_TOPHAT(礼帽运算突出线条) 5.cv2.MORPH_CLOSE(闭运算图片内部膨胀) 6. cv2.resize(改变图像大小) 7.cv2.putText(在图片上放上文本)

    7. cv2.putText(img, text, loc, text_font, font_scale, color, linestick) # 参数说明:img表示输入图片,text表示需要填写的 ...

  6. 二值化方法:Kittler:Minimum Error Thresholding

    Kittler二值化方法,是一种经典的基于直方图的二值化方法.由J. Kittler在1986年发表的论文“Minimum Error Thresholding”提出.论文是对贝叶斯最小错误阈值的准则 ...

  7. Java基于opencv实现图像数字识别(三)—灰度化和二值化

    Java基于opencv实现图像数字识别(三)-灰度化和二值化 一.灰度化 灰度化:在RGB模型中,如果R=G=B时,则彩色表示灰度颜色,其中R=G=B的值叫灰度值:因此,灰度图像每个像素点只需一个字 ...

  8. java 图像灰度化与二值化

    转载:http://www.chinasb.org/archives/2013/01/5053.shtml 1: package org.chinasb.client; 2: 3: import ja ...

  9. OpenCV_基于局部自适应阈值的图像二值化

    在图像处理应用中二值化操作是一个很常用的处理方式,例如零器件图片的处理.文本图片和验证码图片中字符的提取.车牌识别中的字符分割,以及视频图像中的运动目标检测中的前景分割,等等. 较为常用的图像二值化方 ...

随机推荐

  1. vpnbook.py

    vpnbook提供免费的vpn服务,当然了,免费的肯定有限制,vpnbook的限制在于速度,一般只有10kb/s左右,用来看看网页还可以,当主力就不够了. 话说IE存在的意义就是用来下载其它浏览器,我 ...

  2. ARKit从入门到精通(6)-ARSession介绍

    转载:http://blog.csdn.net/u013263917/article/details/73157082 ARSession是一个连接底层与AR视图之间的桥梁,其实ARSCNView内部 ...

  3. 可以用的远程maven地址

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...

  4. Android NFC近场通信1——NFC概述

    最近对NFC挺感兴趣,而且新换的手机也支持NFC功能(最近换了Find5,感觉还不错O(∩_∩)O),所以打算学学NFC编程.NFC就是我们经常说的近场通信.通常距离是4厘米或更短.NFC工作频率是1 ...

  5. mac安装docker,显示无效的命令

    mac安装完docker后,显示无效的命令. 在应用程序中找到docker安装的路径,将该路径写到/etc/paths里面

  6. IIS 7上部署PHP

    前言 前段时间整了一个挂Q的平台.源代码是从网上下载的,后期稍微调整了一下链接和title之类的文字就上线了.详细在这里. 运行了一段时间,除了偶尔出现QQ下线上线,整体效果基本上符合预期,个人感觉很 ...

  7. Redis哈希

    Redis的哈希值是字符串字段和字符串值之间的映射,所以他们是表示对象的完美数据类型 在Redis中的哈希值,可存储超过400十亿键值对. 例子 redis 127.0.0.1:6379> HM ...

  8. Gojs简单例子

    前台代码: <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> ...

  9. 定制应用Repeater 、ListView的模版

    若干年前有个需求:客户可在管理后台给每个新闻内容栏目指定新闻的显示样式,有的可以显示新闻时间,有的则不需要.于是就有了动态模版的应用.记得当时是用 LoadControl 的方式然后 Controls ...

  10. 安卓程序代写 网上程序代写[转]SVN 在线代码托管工具

    本文转载自 : http://blog.csdn.net/ithomer/article/details/8142920  作者:阳光岛主 在互联网环境使用SVN服务,你必须要有一台在互联网环境内支持 ...