java 图像灰度化与二值化
转载:http://www.chinasb.org/archives/2013/01/5053.shtml
1: package org.chinasb.client;
2:
3: import java.awt.Color;
4: import java.awt.image.BufferedImage;
5: import java.io.File;
6: import java.io.IOException;
7:
8: import javax.imageio.ImageIO;
9:
10: public class BinaryTest {
11:
12: public static void main(String[] args) throws IOException {
13: BufferedImage bufferedImage = ImageIO.read(new File("D:/passCodeAction.jpg"));
14: int h = bufferedImage.getHeight();
15: int w = bufferedImage.getWidth();
16:
17: // 灰度化
18: int[][] gray = new int[w][h];
19: for (int x = 0; x < w; x++) {
20: for (int y = 0; y < h; y++) {
21: int argb = bufferedImage.getRGB(x, y);
22: int r = (argb >> 16) & 0xFF;
23: int g = (argb >> 8) & 0xFF;
24: int b = (argb >> 0) & 0xFF;
25: int grayPixel = (int) ((b * 29 + g * 150 + r * 77 + 128) >> 8);
26: gray[x][y] = grayPixel;
27: }
28: }
29:
30: // 二值化
31: int threshold = ostu(gray, w, h);
32: BufferedImage binaryBufferedImage = new BufferedImage(w, h, BufferedImage.TYPE_BYTE_BINARY);
33: for (int x = 0; x < w; x++) {
34: for (int y = 0; y < h; y++) {
35: if (gray[x][y] > threshold) {
36: gray[x][y] |= 0x00FFFF;
37: } else {
38: gray[x][y] &= 0xFF0000;
39: }
40: binaryBufferedImage.setRGB(x, y, gray[x][y]);
41: }
42: }
43:
44: // 矩阵打印
45: for (int y = 0; y < h; y++) {
46: for (int x = 0; x < w; x++) {
47: if (isBlack(binaryBufferedImage.getRGB(x, y))) {
48: System.out.print("*");
49: } else {
50: System.out.print(" ");
51: }
52: }
53: System.out.println();
54: }
55:
56: ImageIO.write(binaryBufferedImage, "jpg", new File("D:/code.jpg"));
57: }
58:
59: public static boolean isBlack(int colorInt) {
60: Color color = new Color(colorInt);
61: if (color.getRed() + color.getGreen() + color.getBlue() <= 300) {
62: return true;
63: }
64: return false;
65: }
66:
67: public static boolean isWhite(int colorInt) {
68: Color color = new Color(colorInt);
69: if (color.getRed() + color.getGreen() + color.getBlue() > 300) {
70: return true;
71: }
72: return false;
73: }
74:
75: public static int isBlackOrWhite(int colorInt) {
76: if (getColorBright(colorInt) < 30 || getColorBright(colorInt) > 730) {
77: return 1;
78: }
79: return 0;
80: }
81:
82: public static int getColorBright(int colorInt) {
83: Color color = new Color(colorInt);
84: return color.getRed() + color.getGreen() + color.getBlue();
85: }
86:
87: public static int ostu(int[][] gray, int w, int h) {
88: int[] histData = new int[w * h];
89: // Calculate histogram
90: for (int x = 0; x < w; x++) {
91: for (int y = 0; y < h; y++) {
92: int red = 0xFF & gray[x][y];
93: histData[red]++;
94: }
95: }
96:
97: // Total number of pixels
98: int total = w * h;
99:
100: float sum = 0;
101: for (int t = 0; t < 256; t++)
102: sum += t * histData[t];
103:
104: float sumB = 0;
105: int wB = 0;
106: int wF = 0;
107:
108: float varMax = 0;
109: int threshold = 0;
110:
111: for (int t = 0; t < 256; t++) {
112: wB += histData[t]; // Weight Background
113: if (wB == 0)
114: continue;
115:
116: wF = total - wB; // Weight Foreground
117: if (wF == 0)
118: break;
119:
120: sumB += (float) (t * histData[t]);
121:
122: float mB = sumB / wB; // Mean Background
123: float mF = (sum - sumB) / wF; // Mean Foreground
124:
125: // Calculate Between Class Variance
126: float varBetween = (float) wB * (float) wF * (mB - mF) * (mB - mF);
127:
128: // Check if new maximum found
129: if (varBetween > varMax) {
130: varMax = varBetween;
131: threshold = t;
132: }
133: }
134:
135: return threshold;
136: }
137: }
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
效果


java 图像灰度化与二值化的更多相关文章
- Java基于opencv实现图像数字识别(三)—灰度化和二值化
Java基于opencv实现图像数字识别(三)-灰度化和二值化 一.灰度化 灰度化:在RGB模型中,如果R=G=B时,则彩色表示灰度颜色,其中R=G=B的值叫灰度值:因此,灰度图像每个像素点只需一个字 ...
- Opencv实现图像的灰度处理,二值化,阀值选择
前几天接触了图像的处理,发现用OPencv处理确实比較方便.毕竟是非常多东西都封装好的.可是要研究里面的东西,还是比較麻烦的,首先,你得知道图片处理的一些知识,比方腐蚀,膨胀,仿射,透射等,还有非常多 ...
- c#图像灰度化、灰度反转、二值化
图像灰度化:将彩色图像转化成为灰度图像的过程成为图像的灰度化处理.彩色图像中的每个像素的颜色有R.G.B三个分量决定,而每个分量有255中值可取,这样一个像素点可以有1600多万(255*255*25 ...
- OpenCV图像的全局阈值二值化函数(OTSU)
cv::threshold(GrayImg, Bw, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU);//灰度图像二值化 CV_THRESH_OTSU是提取图像最 ...
- 实现图像的二值化(java+opencv)
书里的解释: 其他的没找到什么资料,直接参考百度百科 https://baike.baidu.com/item/%E5%9B%BE%E5%83%8F%E4%BA%8C%E5%80%BC%E5%8C%9 ...
- atitit.验证码识别step4--------图形二值化 灰度化
atitit.验证码识别step4--------图形二值化 灰度化 1. 常见二值化的方法原理总结 1 1.1. 方法一:该方法非常简单,对RGB彩色图像灰度化以后,扫描图像的每个像素值,值小于12 ...
- [iOS OpenCV的使用,灰度和二值化]
看网上方法很多,但版本都不够新,我看了网上一些知识,总结了下,来个最新版Xcode6.1的. 最近主要想做iOS端的车牌识别,所以开始了解OpenCV.有兴趣的可以跟我交流下哈. 一.Opencv的使 ...
- [转载+原创]Emgu CV on C# (四) —— Emgu CV on 全局固定阈值二值化
重点介绍了全局二值化原理及数学实现,并利用emgucv方法编程实现. 一.理论概述(转载,如果懂图像处理,可以略过,仅用作科普,或者写文章凑字数) 1.概述 图像二值化是图像处理中的一项基本技术,也 ...
- 机器学习进阶-项目实战-信用卡数字识别 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表示需要填写的 ...
随机推荐
- linux上课
1. service --status-all 2. service sshd restart 3. service --status-all | grep ssh 4. chkconfig --l ...
- jsonp的优缺点
转载:http://www.w3cfuns.com/notes/18271/df9ecd8f0ca5e523ae75745a3996c47c.html JSONP的优缺点 1.优点 ...
- 如何设置div高度为100%
div高度通常都是固定值,直接将div高度设为100%是无效的,那么如何设置才能有效呢? 直接给div设置height:100%即可,无效的原因一定是父元素的高度为0,最常见的就是给body的直接元素 ...
- Hibernate Synchronizer3——一个和hibernate Tool类似的小插件之使用方法
首先,要告诉大家的是,当我们要自动生成Mapping File的时候,我们除了使用hibernae tools之外,还可以通过一个更为简洁的插件,只需通过点击: 1.Hibernate Configu ...
- [转]实体类(VO,DO,DTO)的划分
原文地址:http://blog.sina.com.cn/s/blog_7a4cdec80100wkyh.html 经常会接触到VO,DO,DTO的概念,本文从领域建模中的实体划分和项目中的实际应用情 ...
- [转]jquery 对 Json 的各种遍历
原文地址:http://caibaojian.com/jquery-each-json.html 概述 JSON(javascript Object Notation) 是一种轻量级的数据交换格式,采 ...
- 【BZOJ 1492】【NOI 2007】货币兑换Cash
这是道CDQ分治的例题: $O(n^2)$的DP: f [1]←S* Rate[1] / (A[1] * Rate[1] + B[1]) Ans←SFor i ← 2 to n For j ←1 to ...
- 【BZOJ 3809】Gty的二逼妹子序列
这个莫队如果用线段树来维护的话,复杂度是$O(n\sqrt{n}logn+qlogn)$ 很明显,可以看出来莫队每次$O(1)$的移动因为套上了线段树变成了$O(logn)$,但莫队移动的总数是非常大 ...
- JavaScript写一个小乌龟推箱子游戏
推箱子游戏是老游戏了, 网上有各种各样的版本, 说下推箱子游戏的简单实现,以及我找到的一些参考视频和实例: 推箱子游戏的在线DEMO : 打开 如下是效果图: 这个拖箱子游戏做了移动端的适配, 我使用 ...
- org.apache.commons.lang3.ArrayUtils 学习笔记
package com.nihaorz.model; /** * @作者 王睿 * @时间 2016-5-17 上午10:05:17 * */ public class Person { privat ...