atitit.验证码识别step4--------图形二值化 灰度化
1. 常见二值化的方法原理总结 1
1.1. 方法一:该方法非常简单,对RGB彩色图像灰度化以后,扫描图像的每个像素值,值小于127的将像素值设为0(黑色),值大于等于127的像素值设为255(白色)。
1
1.2. 方法二:最常见的二值处理方法是计算像素的平均值K,
2
1.3. 方法三:使用直方图方法来寻找二值化阈值, 2
1.4. 方法四:使用近似一维Means方法寻找二值化阈值,(推荐) 3
2. 使用类库imageio 3
3. 参考 4
1. 常见二值化的方法原理总结
要本文讨论的方法仅针对RGB色彩空间。
1.1. 方法一:该方法非常简单,对RGB彩色图像灰度化以后,扫描图像的每个像素值,值小于127的将像素值设为0(黑色),值大于等于127的像素值设为255(白色)。
该方法的好处是计算
量少速度快。缺点更多首先阈值为127没有任何理由可以解释,其次完全不考虑图像的
像素分布情况与像素值特征。可以说该方法是史最弱智的二值处理方法一点也不为过。
作者:: 老哇的爪子 Attilax 艾龙, EMAIL:[email protected]
转载请注明来源: http://blog.csdn.net/attilax
1.2. 方法二:最常见的二值处理方法是计算像素的平均值K,
描图像的每个像素值如像素值大于K
像素值设为255(白色),值小于等于K像素值设为0(黑色)。该方法相比方法一,阈值的
选取稍微有点智商,可以解释。但是使用平均值作为二值化阈值同样有个致命的缺点,
可能导致部分对象像素或者背景像素丢失。二值化结果不能真实反映源图像信息。
1.3. 方法三:使用直方图方法来寻找二值化阈值,
直方图是图像的重要特质,直方图方法选择二值
化阈值主要是发现图像的两个最高的峰,然后在阈值取值在两个峰之间的峰谷最低处。
该方法相对前面两种方法而言稍微精准一点点。结果也更让人可以接受。
1.4. 方法四:使用近似一维Means方法寻找二值化阈值,(推荐)
http://en.wikipedia.org/wiki/Thresholding_(image_processing)
使用近似一维Means方法寻找二值化阈值,该方法的大致步骤如下:
1. 一个初始化阈值T,可以自己设置或者根据随机方法生成。
2. 根据阈值图每个像素数据P(n,m)分为对象像素数据G1与背景像素数据G2。(n为
行,m为列)
3. G1的平均值是m1, G2的平均值是m2
4. 一个新的阈值T’ = (m1 + m2)/2
5. 回到第二步,用新的阈值继续分像素数据为对象与北京像素数据,继续2~4步,
直到计算出来的新阈值等于上一次阈值。
前面三种在以前的博文中都有涉及,最后一种二值化方法的代码如下:
2. 使用类库imageio
prj。atibrow
ImageDemo demo = new ImageDemo();
demo.binaryImage(deboxJpg,bin_jpg);
public void binaryImage(String pathname,String pathname2) throws IOException {
//String pathname = System.getProperty("user.dir")
//+ "/src/2722425974762424026.jpg";
File file = new File(pathname);
BufferedImage image = ImageIO.read(file);
int width = image.getWidth();
int height = image.getHeight();
BufferedImage grayImage = new BufferedImage(width, height,
BufferedImage.TYPE_BYTE_BINARY);// 重点,技巧在这个参数BufferedImage.TYPE_BYTE_BINARY
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
int rgb = image.getRGB(i, j);
grayImage.setRGB(i, j, rgb);
}
}
File newFile = new File(pathname2);
ImageIO.write(grayImage, "jpg", newFile);
}
3. 参考
图像处理之常见二值化方法汇总 - 流浪的鱼 - 博客频道 - CSDN.NET.htm
JAVA灰度化、二值化图片如此简单方便 - 懒人小何 - 博客频道 - CSDN_NET.htm