基于Java对图片进行二值化处理
一直以来对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。
- import java.awt.Color;
- import java.awt.image.BufferedImage;
- import java.io.File;
- import java.io.IOException;
- import javax.imageio.ImageIO;
- public class ImageTest {
- public static void main(String[] args) throws IOException {
- String filename = "D:" + File.separator + "/123.jpg";// separator是File里的一个常量,由于java历史遗留问题故为小写
- File file = new File(filename);
- BufferedImage bi = ImageIO.read(file);
- // 获取当前图片的高,宽,ARGB
- int h = bi.getHeight();
- int w = bi.getWidth();
- int rgb = bi.getRGB(0, 0);
- int arr[][] = new int[w][h];
- // 获取图片每一像素点的灰度值
- for (int i = 0; i < w; i++) {
- for (int j = 0; j < h; j++) {
- // getRGB()返回默认的RGB颜色模型(十进制)
- arr[i][j] = getImageRgb(bi.getRGB(i, j));//该点的灰度值
- }
- }
- BufferedImage bufferedImage=new BufferedImage(w, h, BufferedImage.TYPE_BYTE_BINARY);// 构造一个类型为预定义图像类型之一的 BufferedImage,TYPE_BYTE_BINARY(表示一个不透明的以字节打包的 1、2 或 4 位图像。)
- int FZ=130;
- for (int i = 0; i < w; i++) {
- for (int j = 0; j < h; j++) {
- if(getGray(arr,i,j,w,h)>FZ){
- int black=new Color(255,255,255).getRGB();
- bufferedImage.setRGB(i, j, black);
- }else{
- int white=new Color(0,0,0).getRGB();
- bufferedImage.setRGB(i, j, white);
- }
- }
- }
- ImageIO.write(bufferedImage, "jpg", new File("D:"+File.separator+"new123.jpg"));
- }
- private static int getImageRgb(int i) {
- String argb = Integer.toHexString(i);// 将十进制的颜色值转为十六进制
- // argb分别代表透明,红,绿,蓝 分别占16进制2位
- int r = Integer.parseInt(argb.substring(2, 4),16);//后面参数为使用进制
- int g = Integer.parseInt(argb.substring(4, 6),16);
- int b = Integer.parseInt(argb.substring(6, 8),16);
- int result=(int)((r+g+b)/3);
- return result;
- }
- //自己加周围8个灰度值再除以9,算出其相对灰度值
- public static int getGray(int gray[][], int x, int y, int w, int h)
- {
- int rs = gray[x][y]
- + (x == 0 ? 255 : gray[x - 1][y])
- + (x == 0 || y == 0 ? 255 : gray[x - 1][y - 1])
- + (x == 0 || y == h - 1 ? 255 : gray[x - 1][y + 1])
- + (y == 0 ? 255 : gray[x][y - 1])
- + (y == h - 1 ? 255 : gray[x][y + 1])
- + (x == w - 1 ? 255 : gray[x + 1][ y])
- + (x == w - 1 || y == 0 ? 255 : gray[x + 1][y - 1])
- + (x == w - 1 || y == h - 1 ? 255 : gray[x + 1][y + 1]);
- return rs / 9;
- }
- }
看下效果吧:
基于Java对图片进行二值化处理的更多相关文章
- Java 对二值化图片识别连通域
用Java 对 已经 二值化了的图片 标记连通域 每块的连通域都标记不一样的数字 public static void main(String [] args) throws IOException ...
- 图像处理------基于Otsu阈值二值化
一:基本原理 该方法是图像二值化处理常见方法之一,在Matlab与OpenCV中均有实现. Otsu Threshing方法是一种基于寻找合适阈值实现二值化的方法,其最重 要的部分是寻找图像二值化阈值 ...
- Mac中opencv批量对图片进行二值化
对灰度图像进行二值化,传入的图片是手写汉字的截图,通过二值化把字的部分提出来.用ostu进行二值化 #include <stdio.h> #include <iostream> ...
- 深度学习实践-强化学习-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) ...
- 机器学习进阶-项目实战-信用卡数字识别 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表示需要填写的 ...
- 二值化方法:Kittler:Minimum Error Thresholding
Kittler二值化方法,是一种经典的基于直方图的二值化方法.由J. Kittler在1986年发表的论文“Minimum Error Thresholding”提出.论文是对贝叶斯最小错误阈值的准则 ...
- Java基于opencv实现图像数字识别(三)—灰度化和二值化
Java基于opencv实现图像数字识别(三)-灰度化和二值化 一.灰度化 灰度化:在RGB模型中,如果R=G=B时,则彩色表示灰度颜色,其中R=G=B的值叫灰度值:因此,灰度图像每个像素点只需一个字 ...
- java 图像灰度化与二值化
转载:http://www.chinasb.org/archives/2013/01/5053.shtml 1: package org.chinasb.client; 2: 3: import ja ...
- OpenCV_基于局部自适应阈值的图像二值化
在图像处理应用中二值化操作是一个很常用的处理方式,例如零器件图片的处理.文本图片和验证码图片中字符的提取.车牌识别中的字符分割,以及视频图像中的运动目标检测中的前景分割,等等. 较为常用的图像二值化方 ...
随机推荐
- vpnbook.py
vpnbook提供免费的vpn服务,当然了,免费的肯定有限制,vpnbook的限制在于速度,一般只有10kb/s左右,用来看看网页还可以,当主力就不够了. 话说IE存在的意义就是用来下载其它浏览器,我 ...
- ARKit从入门到精通(6)-ARSession介绍
转载:http://blog.csdn.net/u013263917/article/details/73157082 ARSession是一个连接底层与AR视图之间的桥梁,其实ARSCNView内部 ...
- 可以用的远程maven地址
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...
- Android NFC近场通信1——NFC概述
最近对NFC挺感兴趣,而且新换的手机也支持NFC功能(最近换了Find5,感觉还不错O(∩_∩)O),所以打算学学NFC编程.NFC就是我们经常说的近场通信.通常距离是4厘米或更短.NFC工作频率是1 ...
- mac安装docker,显示无效的命令
mac安装完docker后,显示无效的命令. 在应用程序中找到docker安装的路径,将该路径写到/etc/paths里面
- IIS 7上部署PHP
前言 前段时间整了一个挂Q的平台.源代码是从网上下载的,后期稍微调整了一下链接和title之类的文字就上线了.详细在这里. 运行了一段时间,除了偶尔出现QQ下线上线,整体效果基本上符合预期,个人感觉很 ...
- Redis哈希
Redis的哈希值是字符串字段和字符串值之间的映射,所以他们是表示对象的完美数据类型 在Redis中的哈希值,可存储超过400十亿键值对. 例子 redis 127.0.0.1:6379> HM ...
- Gojs简单例子
前台代码: <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> ...
- 定制应用Repeater 、ListView的模版
若干年前有个需求:客户可在管理后台给每个新闻内容栏目指定新闻的显示样式,有的可以显示新闻时间,有的则不需要.于是就有了动态模版的应用.记得当时是用 LoadControl 的方式然后 Controls ...
- 安卓程序代写 网上程序代写[转]SVN 在线代码托管工具
本文转载自 : http://blog.csdn.net/ithomer/article/details/8142920 作者:阳光岛主 在互联网环境使用SVN服务,你必须要有一台在互联网环境内支持 ...