社区
Java SE
帖子详情
如何将一张图片中的文字提取出来
h541939302
2013-02-22 04:31:19
如何将一张图片中的文字提取出来
...全文
2148
10
打赏
收藏
如何将一张图片中的文字提取出来
如何将一张图片中的文字提取出来
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
10 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
nj_dobetter
2013-07-17
打赏
举报
回复
OCR,模式识别、人工智能
linmb
2013-07-17
打赏
举报
回复
http://blog.csdn.net/zhoushuyan/article/details/5948289 结贴吧!楼猪
linmb
2013-07-17
打赏
举报
回复
http://blog.csdn.net/zhoushuyan/article/details/5948289
失落夏天
2013-02-24
打赏
举报
回复
技术上可以实现,就像人脸识别那样,但是我感觉技术到了那种程度的话,就不会来csdn了。
太上绝情
2013-02-24
打赏
举报
回复
用ocr技术,找找ocr的库吧,自己搞恐怕比较困难
zqfddqr
2013-02-22
打赏
举报
回复
这个要万事俱备的。首先你的图片要比较规整 字体要对其,识别验证码几个字符还是可以的长篇的就不可能了。可以找java开源项目试试看写一个不太现实。
JavaNet的牛肉粉丝
2013-02-22
打赏
举报
回复
前些天在这里发过一个帖子 是关于抢票的 可以参考:http://bbs.csdn.net/topics/390269242?page=1#post-392825144 这个问题已经解决。 原来是铁道部在中途替换了token 导致重复提交。铁道部还真有心,以前是 https协议,现在换成了http协议。然后以前在第一步获取token是为了迷惑群众,在中途以前的返回码 200,硬是改成了一个304。不说多了 求教大家一个问题 以前铁道部的登录验证码没有在图片中加几根横线 非常好识别 Tesseract-OCR基本上10次就识别出来 然后现在加了几根横线 Tesseract-OCR基本上100次能中一次就不错了 。现在自己想了下 在网上弄了一个去掉图片中的横线的方法 但是一过滤图片就成了如下效果。 <br/> 有没有人能帮忙写个过滤算法 把横线过滤掉,字母保留成黑色?跪求! 如果有人解决,我愿意把我现在写好的抢票加上自动识别后贡献出去。让大家能在回家的时候抢到一张火车票。 附加过滤代码: package org.image.test.one; import java.awt.Image; import java.awt.Toolkit; import java.awt.color.ColorSpace; import java.awt.geom.AffineTransform; import java.awt.image.AffineTransformOp; import java.awt.image.BufferedImage; import java.awt.image.ColorConvertOp; import java.awt.image.ColorModel; import java.awt.image.ConvolveOp; import java.awt.image.Kernel; import java.awt.image.MemoryImageSource; import java.awt.image.PixelGrabber; import java.awt.image.RescaleOp; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import javax.imageio.ImageIO; public class MyImgFilter { BufferedImage image; private int iw, ih; private int[] pixels; public MyImgFilter(BufferedImage image) { this.image = image; iw = image.getWidth(); ih = image.getHeight(); pixels = new int[iw * ih]; } /** 图像二值化 */ public BufferedImage changeGrey() { PixelGrabber pg = new PixelGrabber(image.getSource(), 0, 0, iw, ih, pixels, 0, iw); try { pg.grabPixels(); } catch (InterruptedException e) { e.printStackTrace(); } // 设定二值化的域值,默认值为100 int grey = 100; // 对图像进行二值化处理,Alpha值保持不变 ColorModel cm = ColorModel.getRGBdefault(); for (int i = 0; i < iw * ih; i++) { int red, green, blue; int alpha = cm.getAlpha(pixels[i]); if (cm.getRed(pixels[i]) > grey) { red = 255; } else { red = 0; } if (cm.getGreen(pixels[i]) > grey) { green = 255; } else { green = 0; } if (cm.getBlue(pixels[i]) > grey) { blue = 255; } else { blue = 0; } pixels[i] = alpha << 24 | red << 16 | green << 8 | blue; // 通过移位重新构成某一点像素的RGB值 } // 将数组中的象素产生一个图像 Image tempImg = Toolkit.getDefaultToolkit().createImage(new MemoryImageSource(iw, ih, pixels, 0, iw)); image = new BufferedImage(tempImg.getWidth(null), tempImg.getHeight(null), BufferedImage.TYPE_INT_BGR); image.createGraphics().drawImage(tempImg, 0, 0, null); return image; } /** 中值滤波 */ public BufferedImage getMedian() { PixelGrabber pg = new PixelGrabber(image.getSource(), 0, 0, iw, ih, pixels, 0, iw); try { pg.grabPixels(); } catch (InterruptedException e) { e.printStackTrace(); } // 对图像进行中值滤波,Alpha值保持不变 ColorModel cm = ColorModel.getRGBdefault(); for (int i = 1; i < ih - 1; i++) { for (int j = 1; j < iw - 1; j++) { int red, green, blue; int alpha = cm.getAlpha(pixels[i * iw + j]); // int red2 = cm.getRed(pixels[(i - 1) * iw + j]); int red4 = cm.getRed(pixels[i * iw + j - 1]); int red5 = cm.getRed(pixels[i * iw + j]); int red6 = cm.getRed(pixels[i * iw + j + 1]); // int red8 = cm.getRed(pixels[(i + 1) * iw + j]); // 水平方向进行中值滤波 if (red4 >= red5) { if (red5 >= red6) { red = red5; } else { if (red4 >= red6) { red = red6; } else { red = red4; } } } else { if (red4 > red6) { red = red4; } else { if (red5 > red6) { red = red6; } else { red = red5; } } } int green4 = cm.getGreen(pixels[i * iw + j - 1]); int green5 = cm.getGreen(pixels[i * iw + j]); int green6 = cm.getGreen(pixels[i * iw + j + 1]); // 水平方向进行中值滤波 if (green4 >= green5) { if (green5 >= green6) { green = green5; } else { if (green4 >= green6) { green = green6; } else { green = green4; } } } else { if (green4 > green6) { green = green4; } else { if (green5 > green6) { green = green6; } else { green = green5; } } } // int blue2 = cm.getBlue(pixels[(i - 1) * iw + j]); int blue4 = cm.getBlue(pixels[i * iw + j - 1]); int blue5 = cm.getBlue(pixels[i * iw + j]); int blue6 = cm.getBlue(pixels[i * iw + j + 1]); // int blue8 = cm.getBlue(pixels[(i + 1) * iw + j]); // 水平方向进行中值滤波 if (blue4 >= blue5) { if (blue5 >= blue6) { blue = blue5; } else { if (blue4 >= blue6) { blue = blue6; } else { blue = blue4; } } } else { if (blue4 > blue6) { blue = blue4; } else { if (blue5 > blue6) { blue = blue6; } else { blue = blue5; } } } pixels[i * iw + j] = alpha << 24 | red << 16 | green << 8 | blue; } } // 将数组中的象素产生一个图像 Image tempImg = Toolkit.getDefaultToolkit().createImage(new MemoryImageSource(iw, ih, pixels, 0, iw)); image = new BufferedImage(tempImg.getWidth(null), tempImg.getHeight(null), BufferedImage.TYPE_INT_BGR); image.createGraphics().drawImage(tempImg, 0, 0, null); return image; } public BufferedImage getGrey() { ColorConvertOp ccp = new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_GRAY), null); return image = ccp.filter(image, null); } // Brighten using a linear formula that increases all color values public BufferedImage getBrighten() { RescaleOp rop = new RescaleOp(1.25f, 0, null); return image = rop.filter(image, null); } // Blur by "convolving" the image with a matrix public BufferedImage getBlur() { float[] data = { .1111f, .1111f, .1111f, .1111f, .1111f, .1111f, .1111f, .1111f, .1111f, }; ConvolveOp cop = new ConvolveOp(new Kernel(3, 3, data)); return image = cop.filter(image, null); } // Sharpen by using a different matrix public BufferedImage getSharpen() { float[] data = { 0.0f, -0.75f, 0.0f, -0.75f, 4.0f, -0.75f, 0.0f, -0.75f, 0.0f }; ConvolveOp cop = new ConvolveOp(new Kernel(3, 3, data)); return image = cop.filter(image, null); } // 11) Rotate the image 180 degrees about its center point public BufferedImage getRotate() { AffineTransformOp atop = new AffineTransformOp(AffineTransform.getRotateInstance(Math.PI, image.getWidth() / 2, image.getHeight() / 2), AffineTransformOp.TYPE_NEAREST_NEIGHBOR); return image = atop.filter(image, null); } public BufferedImage getProcessedImg() { return image; } public static void main(String[] args) throws IOException { FileInputStream fin = new FileInputStream("F:\\passCode.png"); BufferedImage bi = ImageIO.read(fin); MyImgFilter flt = new MyImgFilter(bi); flt.changeGrey(); flt.getGrey(); flt.getBrighten(); bi = flt.getProcessedImg(); //String pname = args[0].substring(0, args[0].lastIndexOf(".")); File file = new File( "F:\\passCode.jpg"); ImageIO.write(bi, "jpg", file); } } Java code ? 1 2 3 4 5 6 7 8 9 String path = "D:\\passCodeAction.jpg"; FileInputStream fin = new FileInputStream(path); BufferedImage bi = ImageIO.read(fin); MyImgFilter flt = new MyImgFilter(bi); flt.changeGrey(); flt.getMedian(); flt.getGrey(); flt.getBrighten(); bi = flt.getProcessedImg(); 上面两张图片识别还是可以 但是遇到有些横线和字母的颜色相同的时候,有些字母就只能看到一个轮廓。
搞什么哦
2013-02-22
打赏
举报
回复
前段时间不是有很厉害的人发过12306验证码提取么? 快去找找
花谢尊前不敢香
2013-02-22
打赏
举报
回复
无能为力。。。目前貌似还没有这样的技术或者软件
基于OpenCVsharp的C#程序
提取
文字
区域
从
一张
图片
中
,把
文字
圈出来。这一步骤对OCR(Optical Character Recognition)非常有用,因为一般的OCR引擎只是拿来识别
文字
,并没有对
图片
做预处理,因此精度可能会收到
图片
质量影响。 我们这里只是粗略的查找...
BMP的水印技术,你可以吧
文字
写到
图片
里,然后可以
提取
出来
你可以吧
文字
写到
图片
里,然后可以
提取
出来,但从外表上看不出来
图片
和加水印前有是吗区别
Baidu.Aip.Ocr
文字
识别 winform 源码
Baidu.Aip.Ocr
文字
识别. 拖拽或选择
一张
图片
至本程序,点击"开始
提取
",就能够把其
中
的
文字
识别出来,准确率很高. 这个是免费的,每天只能用500次
Android OpenCV应用篇三:
提取
图片
中
的
文字
如何从
一张
图片
中
将
文字
提取
出来? 前言 在开始之前,我们先来看一个字 高 可以看到,这个字体是上
中
下结构,相应的,我们的汉字还有左
中
右结构等等,我们如何在识别的过程
中
,不会吧这些特殊结构的字体识别成多...
OCR识别
提取
图片
中
文字
原理
OCR识别
提取
图片
中
文字
原理· 预处理:对包含
文字
的图像进行处理以便后续进行特征
提取
、学习。这个过程的主要目的是减少图像
中
的无用信息,以便方便后面的处理。在这个步骤通常有:灰度化(如果是彩色图像)、降噪...
Java SE
62,614
社区成员
307,327
社区内容
发帖
与我相关
我的任务
Java SE
Java 2 Standard Edition
复制链接
扫一扫
分享
社区描述
Java 2 Standard Edition
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章