精华内容
下载资源
问答
  • 实用方便简单,可实现对指定的图片中文字进行提取,速度很快,很方便.
  • 用Python提取图片中文字,用到的工具包有PIL,pytesseract,tesseract-ocr 注意: 库的安装相对麻烦一点,一般都是不能直接安装成功的,这里总结了安装过程的一些坑给大家参考。 (1)首先是PIL库安装,有的电脑...
  • 利用C++实现图片文字提取,识别准确率达到了80%,特此分享给大家学习
  • C#图片识别 pdf转图片图片内容进行识别 提取图片内信息
  • 利用python提取图片中文字,代码精简,文档齐全
  • 核心功能:快速截取图像,图像里的文字转换成文本文字(txt、doc等文本格式)。 重点1:“直接截取图像”的意思是,像QQ截图一样,直接截取当前屏幕的图像,极其方便! 重点2:这是本软件,优于市面上所有图像文字...
  • 适用于图片文字识别,对初学者的学习有巨大的作用,对同领域的研究人员的学者有很大的参考价值。
  • 首先打开手机应用商店下载并安装一个APP叫#拍照取字# ...[图片上传失败…(image-9a9fbe-1554088338388)...打开#拍照取字#,从相册选取要取字的图片 图片选取后,首先进行裁剪,拖住边框进行上下左右移动,从而达到...
    1. 首先打开手机应用商店下载并安装一个APP叫#拍照取字#

      手机怎么快速把jpg图片中的文字提取出来](http://jingyan.baidu.com/album/3c343ff7a813450d3779638c.html?picindex=1)

      [图片上传失败…(image-9a9fbe-1554088338388)]

    2. 打开#拍照取字#,从相册中选取要取字的图片

      手机怎么快速把jpg图片中的文字提取出来

    3. 图片选取后,首先进行裁剪,拖住边框进行上下左右移动,从而达到最佳扫描结果,裁剪完毕后,点击右下角的对勾进行扫描。

      手机怎么快速把jpg图片中的文字提取出来

    4. 扫描完成后,进行再次编辑,如去空格,编辑文字等

      手机怎么快速把jpg图片中的文字提取出来

    5. 以上步骤完成后,就可以把提取出来的文字进行分享使用了

      手机怎么快速把jpg图片中的文字提取出来

    展开全文
  • 1、双击“天若OCR文字识别.exe”可执行程序,会有一个小图标出现在左下角任务栏; 2、鼠标放到小图标上会提示“上级开始截图识别”,然后双击该图标,即可选择区域进行OCR识别
  • 图片文字提取出来的步骤: 步骤一:首先我们运行下载得力OCR文字识别(http://www.deliocr.cn/)软件,并在界面上会看到四个功能:图片识别、截图识别、证件发票、扫描仪/数码相机。 安装好后就是这样: 步骤二:...

    很多时候,我们看到图片中的文字,想要提取出来。如果一个个字打就会耗费很多时间。其实我们可以用文字识别软件——得力OCR文字识别软件。

    图片文字提取出来的步骤:

    步骤一:首先我们运行下载得力OCR文字识别(http://www.deliocr.cn/)软件,并在界面上会看到四个功能:图片识别、截图识别、证件发票、扫描仪/数码相机。

    在这里插入图片描述

    安装好后就是这样:
    在这里插入图片描述
    步骤二:接着界面上会有添加图片按钮,提示将要识别的图片添加到界面上进行识别。或者是直接拖曳图片到界面上也可以。

    在这里插入图片描述

    步骤三:图片添加完毕后,点击开始识别,自动进入识别图片上的文字,软件自动解析,不需要再进行其它操作,等待识别完毕后即可。

    在这里插入图片描述

    步骤四:识别完毕后,就可以在软件页面上显示出来,下方有个复制按钮,点击该按钮,就可以将图片上的文字识别到软件上。还可进行对比,翻译。功能很强大。

    在这里插入图片描述

    有了以上的图片图片文字识别教程,相信已经帮助你解决了图片不能编辑复制问题。平时在生活上、工作上遇到这类问题,都可以使用以上的工具去进行识别图片文字,还支持网页上不可复制的文字提取,在生活中提供了很大的便捷。

    展开全文
  • 人工智能微信小程序之识别图片上的文字提取出来,微信小程序+java后台,使用百度文字识别来检测图片上的文字
  • java图片提取文字信息java图片提取文字信息java图片提取文字信息
  • 1.读取XPS文件文字,并提取所需部分; 2.提取图片,包括两种情况:1.直接提取文件图片文件并保存;2.提取复合的图片文件(对原始图片处理后的图片)并保存。
  • 部署环境后,将extraction.exe 放置到需要提取文字的图片文件夹并打开,识别后会将图片文字图片文字为命名放置到桌面。
  • 如何提取图片中文字
  • OCR图片文字提取工具

    2018-09-05 16:39:35
    这是一款面向电脑端的图片文字识别提取软件,运用OCR技术,可以解决图片文字提取、网站文字不能复制时的提取、只想提取区域内一部分文字、日常白领编辑等场景。
  • 主要介绍了Python3使用腾讯云文字识别(腾讯OCR)提取图片中文字内容方法详解,需要的朋友可以参考下
  • OCR提取图片中文字.exe

    2021-08-19 11:04:02
    图片提取文字工具,非常实用
  • 图片文字提取工具

    2018-01-18 00:10:01
    把图片上的文字提取出转化为可编辑文档,大大方便了文件处理的速度,非常便利!
  • 把图片里的文字提取出来,可以自由进行编辑,提取出来后为txt格式,由于资源太大,分成了三个卷来上传的
  • 图片文字提取小工具

    2013-02-27 14:40:19
    很方便的文字提取小工具,挺好用的,且无毒无害
  • 通过vs2013mfc,将图片上的文字提取出来,然后通过网络传输,传到客户端。提取图片区域可以控制
  • VC++ 图像文字提取

    热门讨论 2016-04-14 09:25:58
    《VC++ 图像文字提取》项目,是采用vc++和opencv技术对单张的图片进行分析,提取出图片上面的文字信息,去掉杂余的信息(图案等)形成新的只含有文字的图片;对模式识别,车牌识别,图片文字抽取等opencv学习有一定...
  • 如何从一张图片中将文字提取出来? 前言 在开始之前,我们先来看一个字 高 可以看到,这个字体是上下结构,相应的,我们的汉字还有左右结构等等,我们如何在识别的过程,不会吧这些特殊结构的字体识别成多...

    上篇我们大致了解了如何运用OpenCV在Android上进行图片但简单处理

    Android OpenCV应用篇二:图片处理

    接下来我们就运用之前的一些相关技术来搞点事情:
    如何从一张图片中将文字提取出来?


    前言

    在开始之前,我们先来看一个字

    可以看到,这个字体是上中下结构,相应的,我们的汉字还有左中右结构等等,我们如何在识别的过程中,不会吧这些特殊结构的字体识别成多个?

    这里我们就用到了我们前一篇中的技术:**腐蚀**

    看一下高字的腐蚀效果:
    可以看出,完全融为一体,这为我们后面准确的提取文字区域提供了基础。

    当然,我们传统的都是认为白纸黑字,但实际上并不一定都是这一,所以在此之前我们需要进行排除环境影响,如何处理?

    这里也是用到我们上一篇但知识:

    • 降噪
    • 阈值化

    开始我们的文字提取

    OK前面大致介绍了一下基本操作,我们下面总结一下,然后开始实现
    步骤:

    • 阈值化
    • 腐蚀
    • 降噪
    • 文字区域检测
    • 文字提取

    第一步:阈值化&腐蚀

    由于字体大小,或其他一些字体间的间距、行宽等影响,不同的字体图片可能需要用到等腐蚀效果不同,这里我们只进行原理上的处理,我选了一张比较适中等图片进行操作演示。

        /**
         * 阈值化,并腐蚀
         * @param src
         */
        private void erode(Mat src) {
            // 阈值化
            Imgproc.threshold(src, src, 100, 255, Imgproc.THRESH_BINARY);
    //        Imgproc.adaptiveThreshold(opMat,opMat,255.0,Imgproc.ADAPTIVE_THRESH_GAUSSIAN_C,Imgproc.THRESH_BINARY,3,0.0);
    
            Mat erodeKernel = Imgproc.getStructuringElement(Imgproc.MORPH_ELLIPSE, new Size(5, 5));
            Imgproc.erode(src, src, erodeKernel);
        }
    

    第一步处理效果:

    可以看出,完全转换成了白纸黑字,标题上等红色背景框完全除去掉了。但可以看出有明显的噪声,比如字左下角有一个点等。

    第二步 滤波降噪

    这里我们采用最为简单的中值滤波进行降噪

        /**
         * 采用中值滤波进行降噪
         *
         * @param src
         */
        private void medianBlur(Mat src) {
            Imgproc.medianBlur(src, src, 7);
        }
    

    处理后的效果:

    与上一步骤相比可以看出,噪声明显减少。

    第三步 区域检测

    区域检测,这里我们采用检测连通区域再根据联通区域计算边框的方式进行检测,当然,还有其他的一些检测方法,比如轮廓检测法、边缘检测等方法。

    • 连通区域检测
    • Rect边框计算
    连通区域检测

    首先进行连通区域检测,这里我们采用种子填充法进行连通区域检测,比较常用的还有两遍扫描法

    种子填充法
    详情请查阅 百度百科

    下面开始进行种子填充算法,为了方便展示填充效果,我将每个连通区域都进行了重新赋值,这样就可以得到一个不同颜色值的联通区域展示图。具体代码如下:

        /**
         * 种子填充法进行联通区域检测
         */
        private Mat seedFill(Mat binImg, Mat src) {
            // 用来记录连通区域都数据图
            Mat lableImg = new Mat();
            // 这个是用来展示连通区域都效果图。
            Mat showMat = new Mat(binImg.size(), CvType.CV_8UC3);
            // 不需要记录额外都数据,一个通道就够了。
            binImg.convertTo(lableImg, CvType.CV_32SC1);
    
            int rows = lableImg.rows();
            int cols = lableImg.cols();
    
            double lable = 0;
    
            for (int r = 0; r < rows; r++) {
                for (int c = 0; c < cols; c++) {
                    // 获取种子像素点
                    double[] data = lableImg.get(r, c);
                    if (data == null || data.length < 1) {
                        continue;
                    }
                    if (data[0] == 255) {
                    	// 不是我们要都种子像素,继续
                        // 展示图背景设置为白色
                        showMat.put(r, c, 255, 255, 255);
                        continue;
                    }
                    if (data[0] != 0) {
                        // 已经标记过了,继续
                        continue;
                    }
    
                    // 走到这里说明找到了新的种子像素点,新的填充开始
                    lable++;
                    // 随机生成一个颜色,用来填充展示图
                    double[] color = {Math.random() * 255, Math.random() * 255, Math.random() * 255};
    
                    // 开始种子填充
                    LinkedList<Point> neighborPixels = new LinkedList<>();
                    neighborPixels.push(new Point(r, c));
                    
                    while (!neighborPixels.isEmpty()) {
                        Point curPx = neighborPixels.pop();
                        int row = (int) curPx.x;
                        int col = (int) curPx.y;
                        lableImg.put(row, col, lable);
                        showMat.put(row, col, color);
    
                        // 左边
                        double[] left = lableImg.get(row, col - 1);
                        if (left != null && left.length > 0 && left[0] == 0) {
                            neighborPixels.push(new Point(row, col - 1));
                        }
    
                        // 右边
                        double[] right = lableImg.get(row, col + 1);
                        if (right != null && right.length > 0 && right[0] == 0) {
                            neighborPixels.push(new Point(row, col + 1));
                        }
    
                        // 上边
                        double[] top = lableImg.get(row - 1, col);
                        if (top != null && top.length > 0 && top[0] == 0) {
                            neighborPixels.push(new Point(row - 1, col));
                        }
    
                        // 下边
                        double[] bottom = lableImg.get(row + 1, col);
                        if (bottom != null && bottom.length > 0 && bottom[0] == 0) {
                            neighborPixels.push(new Point(row + 1, col));
                        }
                    }
                }
            }
            // 返回展示图
            return showMat;
        }
    
    

    效果如下:

    从最下面都那幅图可以看出,我们进行都连通区域检测还是比较成功的,可以发现每个字体都是不同都颜色,有一点缺陷就是字的那个点没有连通进去,还有拼音都连成了一体。这个就是前面有提到的字体、风格、字体大小、间距等等影响。当然,这些缺陷都是可以通过更智能但处理方式进行优化的。

    字体边框计算

    通过上一步骤的检测,我们可以得到每个连通区域的像素点,修改上一步骤的代码,在开始新的连通区域检测之前,我们定义一个连通区域坐标点列表集合:

    List<List<Point>> texts = new LinkedList<>();
    

    在进行连通区域检测的时候,每次出栈一个点,就将这个点加入到这个坐标点集合中去:

    Point curPx = neighborPixels.pop();
    int row = (int) curPx.x;
    int col = (int) curPx.y;
    textPoint.add(new Point(col, row));
    

    这样当我们把连通区域检测完成之后就得到一个连通区域点集合的列表:texts
    然后开始计算每个连通区域的边框

            for (List<Point> data : texts) {
                MatOfPoint mat = new MatOfPoint();
                mat.fromList(data);
                Rect rect = Imgproc.boundingRect(mat);
                Imgproc.rectangle(showMat, rect.tl(), rect.br(), new Scalar(255, 0, 0, 255));
            }
    

    上述代码我们利用连通区域点集合计算连通区域边框,并将边框绘制到了效果图上,下面我们看下效果:

    可以看到每个不同颜色的外围都一个矩形边框,包括标点符号以及我们缺陷的 **式** 字的点,我们成功得到了每个字体的边框,距离我们成功提取文字只有一步之遥。
    截取文字

    下面我们进行文字的截取,并将他们展示在一个列表中。

    继续修改上一步的代码:

            // 定义一个文字图片列表用来保存截取出来的文字。
            List<Mat> textMats = new LinkedList<>();
            for (List<Point> data : texts) {
                MatOfPoint mat = new MatOfPoint();
                mat.fromList(data);
                // 计算边框
                Rect rect = Imgproc.boundingRect(mat);
                // 绘制边框
                Imgproc.rectangle(showMat, rect.tl(), rect.br(), new Scalar(255, 0, 0, 255));
                // 利用边框截取文字,并加入到列表中。
                textMats.add(src.submat(rect));
            }
            adapter.setData(textMats);
    
    

    我们在得到每个连通区域后,利用Mat提供的截取方法进行图片的截取,然后我们得到一个文字图片列表,并把它们展示在一个ListView中:

    下面是我从阅读软件中截的一张图,字体、间距等都是比较常规的,我们看下效果:
    在这里插入图片描述
    可以看出效果还不错,除了第一行都标题由于色值原因被过滤掉了,正文基本上都成功提取出来了。

    在来看下另一张丰富排版都提取效果:
    在这里插入图片描述
    可以看的出来,从这个图片中提取文字效果就每那么好了,对待这种排版,我们需要一种更为智能都识别方式。

    最为基本的应用我们就分享到这了。结合文字匹配程序,我们可以在此基础上做更多好玩的工具:身份证信息提取、发票信息提取、名片信息提取等等。

    附上完整的关键部分处理代码:

    import android.graphics.Bitmap;
    import android.os.Bundle;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.ImageView;
    import android.widget.ListView;
    import com.hankang.opencv.R;
    import com.hankang.opencv.base.BasePicturePickActivity;
    import org.opencv.android.Utils;
    import org.opencv.core.*;
    import org.opencv.imgproc.Imgproc;
    
    import java.util.ArrayList;
    import java.util.LinkedList;
    import java.util.List;
    
    public class TextActivity extends BasePicturePickActivity {
        private ImageView imageView;
        private ImageView imageView2;
        private ImageView imageView3;
        private Mat src;
        private Mat org;
        private ListView listView;
        private TextAdapter adapter;
    
        static {
            System.loadLibrary("opencv_java3");
    
        }
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_text_layout);
            imageView = findViewById(R.id.image1);
            imageView2 = findViewById(R.id.image2);
            imageView3 = findViewById(R.id.image3);
            listView = findViewById(R.id.listview);
            adapter = new TextAdapter();
            listView.setAdapter(adapter);
    
    
            findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    erode(src);
                    showResult(src, imageView2);
                }
            });
    
            findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    medianBlur(src);
                    showResult(src, imageView2);
                }
            });
    
            findViewById(R.id.button3).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Mat result = seedFill(src, org);
                    showResult(result, imageView3);
    //                adapter.setData(result);
                }
            });
        }
    
    
        /**
         * 阈值化,并腐蚀
         *
         * @param src
         */
        private void erode(Mat src) {
            // 阈值化
            Imgproc.threshold(src, src, 100, 255, Imgproc.THRESH_BINARY);
    //        Imgproc.adaptiveThreshold(opMat,opMat,255.0,Imgproc.ADAPTIVE_THRESH_GAUSSIAN_C,Imgproc.THRESH_BINARY,3,0.0);
    
            Mat erodeKernel = Imgproc.getStructuringElement(Imgproc.MORPH_ELLIPSE, new Size(5, 5));
            Imgproc.erode(src, src, erodeKernel);
        }
    
        /**
         * 采用中值滤波进行降噪
         *
         * @param src
         */
        private void medianBlur(Mat src) {
            Imgproc.medianBlur(src, src, 7);
        }
    
    
        /**
         * 种子填充法进行联通区域检测
         */
        private Mat seedFill(Mat binImg, Mat src) {
            Mat lableImg = new Mat();
            Mat showMat = new Mat(binImg.size(), CvType.CV_8UC3);
            binImg.convertTo(lableImg, CvType.CV_32SC1);
    
            int rows = lableImg.rows();
            int cols = lableImg.cols();
    
            double lable = 0;
            List<List<Point>> texts = new LinkedList<>();
    
            for (int r = 0; r < rows; r++) {
                for (int c = 0; c < cols; c++) {
                    // 获取种子
                    double[] data = lableImg.get(r, c);
                    if (data == null || data.length < 1) {
                        continue;
                    }
                    if (data[0] == 255) {
                        // 背景
                        showMat.put(r, c, 255, 255, 255);
                        continue;
                    }
                    if (data[0] != 0) {
                        // 已经标记过了
                        continue;
                    }
    
                    // 新的填充开始
                    lable++;
                    double[] color = {Math.random() * 255, Math.random() * 255, Math.random() * 255};
    
                    // 开始种子填充
                    LinkedList<Point> neighborPixels = new LinkedList<>();
                    neighborPixels.push(new Point(r, c));
    
                    List<Point> textPoint = new LinkedList<>();
    
                    while (!neighborPixels.isEmpty()) {
                        Point curPx = neighborPixels.pop();
                        int row = (int) curPx.x;
                        int col = (int) curPx.y;
                        textPoint.add(new Point(col, row));
                        lableImg.put(row, col, lable);
                        showMat.put(row, col, color);
    
                        // 左边
                        double[] left = lableImg.get(row, col - 1);
                        if (left != null && left.length > 0 && left[0] == 0) {
                            neighborPixels.push(new Point(row, col - 1));
                        }
    
                        // 右边
                        double[] right = lableImg.get(row, col + 1);
                        if (right != null && right.length > 0 && right[0] == 0) {
                            neighborPixels.push(new Point(row, col + 1));
                        }
    
                        // 上边
                        double[] top = lableImg.get(row - 1, col);
                        if (top != null && top.length > 0 && top[0] == 0) {
                            neighborPixels.push(new Point(row - 1, col));
                        }
    
                        // 下边
                        double[] bottom = lableImg.get(row + 1, col);
                        if (bottom != null && bottom.length > 0 && bottom[0] == 0) {
                            neighborPixels.push(new Point(row + 1, col));
                        }
                    }
                    texts.add(textPoint);
                }
            }
    
            List<Mat> textMats = new LinkedList<>();
            for (List<Point> data : texts) {
                MatOfPoint mat = new MatOfPoint();
                mat.fromList(data);
                Rect rect = Imgproc.boundingRect(mat);
                Imgproc.rectangle(showMat, rect.tl(), rect.br(), new Scalar(255, 0, 0, 255));
                textMats.add(src.submat(rect));
            }
            adapter.setData(textMats);
    
            return showMat;
        }
    
    
        @Override
        public void onImageLoadSuccess() {
            if (getImageBitmap() == null) {
                return;
            }
            imageView.setImageBitmap(getImageBitmap());
            src = new Mat(getImageBitmap().getHeight(), getImageBitmap().getWidth(), CvType.CV_8UC4);
            Utils.bitmapToMat(getImageBitmap(), src);
            org = new Mat();
            src.copyTo(org);
            Imgproc.cvtColor(src, src, Imgproc.COLOR_RGBA2GRAY);
        }
    
        class TextAdapter extends BaseAdapter {
    
            List<Mat> data = new ArrayList<>();
    
            @Override
            public int getCount() {
                return data.size();
            }
    
            public void setData(List<Mat> data) {
                this.data.clear();
                this.data.addAll(data);
                notifyDataSetChanged();
            }
    
            @Override
            public Object getItem(int position) {
                return data.get(position);
            }
    
            @Override
            public long getItemId(int position) {
                return 0;
            }
    
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                ViewHolder holder;
                View view;
                if (convertView == null) {
                    holder = new ViewHolder();
                    view = LayoutInflater.from(TextActivity.this).inflate(R.layout.layout_list_item, null, false);
                    holder.imageView = view.findViewById(R.id.image);
                    view.setTag(holder);
                } else {
                    holder = (ViewHolder) convertView.getTag();
                    view = convertView;
                }
    
    
                Mat mat = data.get(position);
                Bitmap bitmap = Bitmap.createBitmap(mat.cols(), mat.rows(), Bitmap.Config.ARGB_8888);
                Utils.matToBitmap(mat, bitmap);
                holder.imageView.setImageBitmap(bitmap);
    
                return view;
            }
    
            class ViewHolder {
                public ImageView imageView;
            }
        }
    }
    

    当然,我们这里只是简单的运用OpenCV进行文字的提取,配合一些其他技术例如:TensorFlow,或者其他的一些人工智能,机器学习技术,我们可以将提取出来的文字图片进行文字识别翻译等等。

    在此基础上,我们可以做更多的事情,比如:将图片式的文字自动转换成text文本,拍照翻译、拍照提取文字等等。




    OK,这篇分享到此就结束了。

    如果对你有所帮助的话,

    记得点赞关注。




    未完待续。。。

    展开全文
  • 免费图片文字识别,图片文字提取工具 直接划图识别,方便快捷。超级好用。完全免费,没有任何限制。识别快速准确,傻瓜式操作。
  • 凡眼 文字识别工具用于多用途文字识别和提取,陆续丰富多种识别功能,酌情添加大平台识别通道支持,酌情考虑增加翻译功能等。 使用过程发现任何bug、有任何改进建议、有需要功能扩展或定制,欢迎在反馈留言告知...
  • 如何使用图片文字提取大师提取图片的文字.docx
  • 图片中提取文字

    2014-06-20 12:52:08
    一款从图片中提取字符的简单软件 现只能识别英文和数字不支持中文 其中关键是调用AspriseOCR.dll文件
  • 超强图片提取文字识别(RosettaStone v3.0c)中文绿色特别版

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 52,172
精华内容 20,868
关键字:

怎么把图片中的文字提取出来