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

解决方案 »

  1.   

    前些天在这里发过一个帖子 是关于抢票的 可以参考: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();上面两张图片识别还是可以 但是遇到有些横线和字母的颜色相同的时候,有些字母就只能看到一个轮廓。 
      

  2.   

    这个要万事俱备的。首先你的图片要比较规整 字体要对其,识别验证码几个字符还是可以的长篇的就不可能了。可以找java开源项目试试看写一个不太现实。
      

  3.   

    用ocr技术,找找ocr的库吧,自己搞恐怕比较困难
      

  4.   

    技术上可以实现,就像人脸识别那样,但是我感觉技术到了那种程度的话,就不会来csdn了。
      

  5.   

    http://blog.csdn.net/zhoushuyan/article/details/5948289
      

  6.   

    http://blog.csdn.net/zhoushuyan/article/details/5948289 结贴吧!楼猪