如何将一张图片中的文字提取出来

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开源项目试试看写一个不太现实。
  • 打赏
  • 举报
回复
前些天在这里发过一个帖子 是关于抢票的 可以参考: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验证码提取么? 快去找找
  • 打赏
  • 举报
回复
无能为力。。。目前貌似还没有这样的技术或者软件

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧