精华内容
下载资源
问答
  • 图片提取数字号码

    2019-02-09 22:06:10
    用此软件可以把图片上的数字提取成文本,
  • halcon实现车牌数字的识别,最后将识别出的数字显示到车牌上(附代码及运行图和最后效果图) 进行展示的结果可以看到最终效果很不错。
  • 人工智能微信小程序之识别图片上的文字并提取出来,微信小程序+java后台,使用百度文字识别来检测图片上的文字
  • 对于JPEG图片数字水印提取程序

    热门讨论 2011-04-18 22:42:10
    能够对嵌入水印信息的JPEG图片进行水印的提取 有没有用处 大家可以一起来鉴定一下 呵呵 //函数声明 void InitTable(); int InitTag(); int DecodeMCUBlock(); void IQtIZzBlock(LONG *s); void IZzBlock(LONG *s);...
  • DCT数字水印嵌入与提取过程 还有几种攻击方式 毕业设计可以使用 各位毕业设计课题相关的可以看看 有不明白的地方可以留言 我看到会尽快回答
  • 要想解数独,需要进行计算,图片格式的数字肯定是不行的,所以必须把图片上的数字转换为实实在在的数字才能进行计算。要得到实实在在的数字,我们需要做的是对图片上的数字进行提取和识别。本文先说第一步,图片中...

    前言

    首先要明确我们的任务。要想解数独,需要进行计算,图片格式的数字肯定是不行的,所以必须把图片上的数字转换为实实在在的数字才能进行计算。要得到实实在在的数字,我们需要做的是对图片上的数字进行提取和识别。本文先说第一步,图片中数字的提取。

    在一年之前,我曾用C++尝试过opencv解数独,但由于当时水平有限,未能完成。当时的成果就是透视变换的应用和方格数字的提取。现在稍微简化一下工作,不再从倾斜的数独图片中提取数独,而是直接用正拍且已经提取好的数独开始处理。这里用到的数独图片如下图所示:

    这里写图片描述

    方法

    1.以前的方法

    从上图这样的九宫格图片中提取数字,我以前用的方法是,先利用轮廓提取,通过轮廓的面积进行筛选,得到所有的81个小方格;然后对检测小方格中是否有黑色像素以及像素的多少(排除噪音)来判定哪个小方格中有数字;最后对有数字的小方格再次进行轮廓提取得到数字的轮廓和轮廓外包矩形。

    此方法实现起来相对来说比较麻烦,思路仅供参考。

    2.本次所用方法

    在仔细研究了opencv轮廓提取函数findContours()之后,发现利用轮廓的层级结构会更加简单。作为本节最主要的函数,有必要稍微多说几句。

    cv2.findContours(image, mode, method[, contours[, hierarchy[, offset] ] ]) → contours, hierarchy

    在Python中,findContours()接受如下参数并返回contours和hierarchy。

    1.image 源图像,一般为8为单通道图像,更具体来说,二值图像。其他情况暂且不论。

    2.mode 轮廓检索模式,简要介绍几种:

    • cv2.RETR_EXTERNAL 只检测外轮廓。对所有轮廓设置hierarchy[i][2]=hierarchy[i][3]=-1
    • cv2.RETR_LIST 提取所有轮廓,并放置在list中,检测到的轮廓不建立等级关系。
    • cv2.RETR_TREE 提取所有轮廓,建立网状的轮廓结构。

    3.method 轮廓的近似办法,是提取轮廓上所有像素点,还是只提取关键的一些点。比如一条线段是提取所有点还是只提取两个端点。

    4.contours 检测到的轮廓,为组成轮廓的点集。

    5.hierarchy 下面详述。

    hierarchy

    什么是层级结构呢?我们检测轮廓的时候,有时候可能会出现其中一个轮廓包含了另外一个轮廓,比如同心圆。这里我们认为外侧轮廓为父轮廓,内侧被包含的为子轮廓。同一级别的又有前一个轮廓后一个轮廓。总的来说,hierarchy表达的是不同轮廓之间的 关系和联系。

    这样,每一个轮廓都会有[Next, Previous, First_Child, Parent]

    上面说到,cv2.RETR_EXTERNAL 只检测外轮廓。对所有轮廓设置hierarchy[i][2]=hierarchy[i][3]=-1。由于只检测最外围轮廓,所有检测到的轮廓肯定没有父轮廓和子轮廓,所有层级结构的第三个和第四个元素都设置为-1。

    看下图:

    这里写图片描述

    如果只检测最外围轮廓,那么只会检测到轮廓012

    如果建立层级关系,以轮廓3为例,那么它的父轮廓是2a,子轮廓是3a,没有前一轮廓和后一轮廓,设为-1。所以它的hierarchy应该是[-1,-1,3a,2a]

    如果是轮廓2,那么它的前一轮廓就是1,子轮廓是2a,没有后一轮廓和父轮廓。所以它的hierarchy应该是[-1,1,2a,-1]

    有兴趣的可以仔细看看,没兴趣的可以略过。兴趣更浓的可以去看opencv文档,那里的讲解更加详细。

    这里就说这么多,对于我们本节的内容来说,已经够了。

    上面说了啥

    我觉得大部分人这个时候还会问,上面说了这么一堆到底是要干什么???因为这里确实不是那么清晰明了。

    别忘了我们本节的目的是要提取数字,什么样的轮廓包含数字?

    一般来说经过前面的阈值分割得到二值图像,然后从二值图像中提取的轮廓是这样的。这是处理的比较好的情况下:

    这里写图片描述

    显然最最外面的那个包围所有的就是0号轮廓,里面的九九八十一个小方格就是0号轮廓的子轮廓。而每一个已知数字的轮廓都是对应方格的子轮廓。

    提取数字

    所有我们的办法就是先提取方格,然后提取数字。

    八十一个小方格有什么特点?父轮廓都是0号轮廓!所以:

    boxes = []
    for i in range(len(hierarchy[0])):
        if hierarchy[0][i][3] == 0:
            boxes.append(hierarchy[0][i])

    不记得的可以上翻看一下hierarchy是不是第四个元素表示父轮廓。

    然后从小方格中提取数字轮廓。数字轮廓的有什么特点?其父轮廓有子轮廓,也即是说包含子轮廓的小方格里面就有数字。所以:

    for j in range(len(boxes)):
        if boxes[j][2] != -1:
            x,y,w,h = cv2.boundingRect(contours[boxes[j][2]])
            number_boxes.append([x,y,w,h])

    不记得的可以上翻看一下hierarchy是不是第三个元素表示子轮廓。不等于-1表示存在。

    最后把检测到的数字画出来就可以得到下面的这幅图了。

    这里写图片描述

    代码

    # -*- coding: UTF-8 -*-
    import cv2
    
    img = cv2.imread('001.jpg')
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    ## 阈值分割
    ret,thresh = cv2.threshold(gray,200,255,1)
    
    ## 对二值图像执行膨胀操作
    kernel = cv2.getStructuringElement(cv2.MORPH_CROSS,(5, 5))     
    dilated = cv2.dilate(thresh,kernel)
    
    ## 轮廓提取,cv2.RETR_TREE表示建立层级结构
    image, contours, hierarchy = cv2.findContours(dilated,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
    
    ## 提取小方格,其父轮廓都为0号轮廓
    boxes = []
    for i in range(len(hierarchy[0])):
        if hierarchy[0][i][3] == 0:
            boxes.append(hierarchy[0][i])
    
    ## 提取数字,其父轮廓都存在子轮廓        
    number_boxes = []
    for j in range(len(boxes)):
        if boxes[j][2] != -1:
            #number_boxes.append(boxes[j])
            x,y,w,h = cv2.boundingRect(contours[boxes[j][2]])
            number_boxes.append([x,y,w,h])
            img = cv2.rectangle(img,(x-1,y-1),(x+w+1,y+h+1),(0,0,255),2)
    
    cv2.namedWindow("img", cv2.WINDOW_NORMAL); 
    cv2.imshow("img", img)
    cv2.waitKey(0) 

    下一步

    数字已经提取出来,下一步就该是数字的识别了…


    公众号CVPy,分享OpenCV和Python的实战内容。每一篇都会放出完整的代码。欢迎关注。

    公众号CVPy

    展开全文
  • Python提取数字图片特征向量

    万次阅读 多人点赞 2017-11-10 15:40:56
    在机器学习中有一种学习叫做手写数字识别,其主要功能就是让机器识别出图片中的数字,其步骤主要包括:图片特征提取、将特征值点阵转化为特征向量、进行模型训练。第一步便是提取图片中的特征提取。数据的预处理关系...

    引言

    在机器学习中有一种学习叫做手写数字识别,其主要功能就是让机器识别出图片中的数字,其步骤主要包括:图片特征提取、将特征值点阵转化为特征向量、进行模型训练。第一步便是提取图片中的特征提取。数据的预处理关系着后面模型的构建情况,所以,数据的处理也是机器学习中非常重要的一部分。下面我就说一下如何提取图片中的特征向量。

    图片灰度化

    blob.png =>blob.png

    当我们拿到一种图片的时候,这张图片可能是多种颜色集合在一起的,而我们为了方便处理这张图片,我们首先会将这张图片灰度化(左图灰度化之前,右图灰度化之后)。如果该图片已经是黑白两色的就可以省略此步骤。

    from PIL import Image
    import numpy as np
    
    #打开一张图片
    img = Image.open("image/77.jpg")
    #图片灰度化
    img = img.convert("L")
    #显示图片
    img.show()
    #将图片转换为数组形式,元素为其像素的亮度值
    print np.asarray(img)

    在图片灰度化之前这张图片的数组值应该是一个三维的,灰度化之后将变为二维数组。数组行列数就是图片的像素宽度和高度。

    打印的数组形式如下:

    blob.png

    图片的二值化

    图片的二值化就是将上面的数组化为0和1的形式,转化之前我们要设定一个阈值,大于这个阈值的像素点我们将其设置为1,小于这个阈值的像素点我们将其设置为0。下面我找了一张数字的图片,这张图片已经灰度化过了。我们就直接将它二值化。图片如下:

    blob.png

    图片的像素是32x32的。如果不是要化为此值,这一步我们叫做尺寸归一化。

    #打开一张图片
    img = Image.open("numImage/3.jpg")
    #将图片化为32*21的
    img = img.resize((32, 32))
    #二值化
    img = img.point(lambda x:1 if x > 120 else 0) 
    #将图片转换为数组形式,元素为其像素的亮度值
    img_array = np.asarray(img)
    print img_array

    解释一下上面的代码,resize方法里的参数是一个元组,元素分别是宽和高;point函数是用来二值化图片的,其参数是一个lambda函数,函数体就是判断其元素值是否大于120,这里的120就是上面提到的阈值。

    二值化后的数组:

    blob.png

    在数组中我们可以大似的看到,数字1大似组成了一个3的形状。

    获取网格特征数字统计图

    在图片二值化之后,我们通常需要获取到网格统计图,这里我们的图片尺寸是32*32的,所以我们将其化为8*8的点阵图,步骤如下:

    1、将二值化后的点阵水平平均划线分成8份,竖直平均划线分成8份。

    2、分别统计每一份中像素点为1的个数。

    3、将每一个份统计值组合在一起,构成8*8的点阵统计图。

    下面我写了个函数来将32*32的数组转化成8*8的网格特征数字统计图:

     
    #将二值化后的数组转化成网格特征统计图 def get_features ( array ):     #拿到数组的高度和宽度     h , w  =  array. shape     data  =  [ ]     for x  in  range ( 0 , w/ 4 ):         offset_y  = x *  4         temp  =  [ ]         for y  in  range ( 0 ,h/ 4 ):             offset_x  = y *  4             #统计每个区域的1的值             temp. append ( sum ( sum ( array [ 0+offset_y: 4+offset_y , 0+offset_x: 4+offset_x ] ) ) )         data. append (temp )     return np. asarray (data )

    转化之后我们的到的数组点阵是这样的:

    blob.png

    将二维的统计图转化为一维的特征向量

    这一步就比较简单了,只需要将矩阵全部放到一行即可,直接使用np的reshape()方法即可:

    features_vector =features_array.reshape(features_array.shape[0]*features_array.shape[1])
    print features_vector

    输出结果:

    blob.png

    有些同学可能要问,为什么要将二维的点阵转化成一维的特征向量? 这是因为在机器学习中,数据集的格式就是这样的,数据集的一个样例就是一个特征向量,对个样例组成一个训练集。转化为以为的特征向量是便于我们的使用。

    全部代码(省略灰度化):

    from PIL import Image
    
    import numpy as np
    
    
    
    #将二值化后的数组转化成网格特征统计图
    
    def get_features(array):
        #拿到数组的高度和宽度
        h, w = array.shape
        data = []
        for x in range(0, w/4):
            offset_y = x * 4
            temp = []
            for y in range(0,h/4):
                offset_x = y * 4
                #统计每个区域的1的值
                temp.append(sum(sum(array[0+offset_y:4+offset_y,0+offset_x:4+offset_x])))
            data.append(temp)
        return np.asarray(data)
    
        
    
    #打开一张图片
    img = Image.open("numImage/3.jpg")
    #将图片化为32*32的
    img = img.resize((32, 32))
    
    
    #二值化
    img = img.point(lambda x:1 if x > 120 else 0)
    #将图片转换为数组形式,元素为其像素的亮度值
    img_array = np.asarray(img)
    print img_array
    #得到网格特征统计图
    features_array = get_features(img_array)
    print features_array
    features_vector =features_array.reshape(features_array.shape[0]*features_array.shape[1])
    print features_vector

    原文:http://www.k2zone.cn/?p=977

    展开全文
  • 项目中使用的,很好用,也很不错,能够很好的实现手写体数字的特征提取
  • MNIST手写数字识别库及图片提取代码
  • 找到了利用Matlab提取图片中的数据的源代码image2data,打包上传分享。 原简介: 从事科研或者工程的人员在文档撰写过程中,常需要将文献中的曲线与自己的结果对比,为获取原始数据,一种常用的办法是手动描点,...
  • 由python写的GUI,可以实现数字水印的添加与提取提取是根据添加系数的相关性,实现了盲提取。含有两种攻击测试方法(高斯低通滤波、高斯白噪声)。基于python2.7,watermark.py为主程序,没有打包成exe.
  • MATLAB手写数字识别

    万次阅读 多人点赞 2019-07-31 14:07:22
    本文主要是根据《matlab手写神经网络实现识别手写数字》博客中的...图像大小:图片的灰度值矩阵(28,28); 图像名称:由标签和顺序号组成。标签_顺序号.bmp 训练样本:每个数字的图像名称的顺序号是从0-399,各400...

    本文主要是根据《matlab手写神经网络实现识别手写数字》博客中的代码进行试验。由于没有数据集,所以采用了MNIST数据集进行代码的运行。数据集不同所以需要对代码进行微小改动。

    简介

    数据处理:4000张作为训练样本,1000张作为测试样本;
    图像大小:图片的灰度值矩阵(28,28);
    图像名称:由标签和顺序号组成。标签_顺序号.bmp
    训练样本:每个数字的图像名称的顺序号是从0-399,各400个。
    在这里插入图片描述
    测试样本:每个数字的图像名称的顺序号是从401-500,各100个。
    在这里插入图片描述

    标签制作

    标签格式:
    训练数据集中前400个标签都是[1,0,0,0,0,0,0,0,0,0]代表数字0,401-800个标签都是[0,1,0,0,0,0,0,0,0,0]代表数字2,其余类推。这也就是所谓的onehot
    由于数据集不同,图像的格式也不一样等因素,需要对代码稍微做修改,具体如下:
    制作label时遇到的障碍,xlswrite()函数在写入矩阵时对矩阵大小有限制,一定要小心,因为我的电脑安装的是2003,所以无法对4000列数据直接写入,只好行列互换后再存储,代码将生成两个xsl文件,分别是label.xsl和label2.xsl,分别是训练数据和测试数据的标签。
    增加一个label_create.m文件,用来新建标签文件。
    label_create.m代码:

    % 创建Excel存储label
    % 根据图片的名字,例如:3_101.bmp,第一个数值是标签,第二个是图片数。
    % 为了转换成神经网络的标签,0-9这10个标签应转换为[1,0,0,0,0,0,0,0,0,0],[0,1,0,0,0,0,0,0,0,0]
    % 这样的格式,即第几位是1就代表标签是几?如[0,1,0,0,0,0,0,0,0,0]代表2
    % 例如我们的前 400个图都是0,所以标签都是[1,0,0,0,0,0,0,0,0,0]
    % 因为每个版本的Excel允许存储的行列不同,这里是2003版存储不下4000列,故需要将label矩阵转置后才能存下
    % Excel2003可存储:65536*256
    clear all;
    clc;
    label=zeros(10,4000);
    label2=zeros(10,1000);
    
    eye_sam=eye(10);
    for j=1:10
        label(:,(400*(j-1)+1):400*j)= repmat( eye_sam(:,j),1,400 );
    end
    T=label';
    xlswrite('D:\Documents\MATLAB\label.xls',T);
    
    for j=1:10
        label2(:,(100*(j-1)+1):100*j)= repmat( eye_sam(:,j),1,100 );
    end
    T2=label2';
    xlswrite('D:\Documents\MATLAB\label2.xls',T2);
    

    getdata.m代码修改:

    function[x_train,y_train,x_test,y_test]=getdata()
    % 把图片变成像素矩阵
    % path :图片路径 
    % x_train:训练样本像素矩阵(784,4000)
    % y_train:训练样本标签(10,4000)
    % x_test:测试样本像素矩阵(784,1000)
    % y_test:测试样本标签(10,1000)
    
    x_train = [];
    for i=0:9
        for j=0:399
            x=im2double(imread(strcat('D:\Documents\MATLAB\images4000\',num2str(i),'_', num2str(j),'.bmp')));
            x=reshape(x,784,1);         % 将28*28的数值矩阵变为784*1,每列代表一幅图
            x_train = [x_train,x];      % 每循环一次加入一列数据
        end
    end
    
    x_test =[];
    for i=0:9
        for j=401:500
            x=im2double(imread(strcat('D:\Documents\MATLAB\images_test1000\',num2str(i),'_', num2str(j),'.bmp')));
            x=reshape(x,784,1);         % 将28*28的数值矩阵变为784*1,每列代表一幅图
            x_test = [x_test,x];        % 每循环一次加入一列数据
        end
    end
    
    % 读取标签文件,注意:由于标签的存储问题,读入后需要进行转置
    data=xlsread('label.xls');
    data2=xlsread('label2.xls');
    y_train=data';
    y_test = data2';
    
    % 返回的参数
    x_train;
    y_train;
    x_test;
    y_test;
    
    end
    
    

    其余代码保持和原博客中的一致。全部文件如下图:
    在这里插入图片描述
    运行main.m文件即可。

    文件下载地址:链接:https://pan.baidu.com/s/1JhPs94qO-7VkPI_kknv_Tg
    提取码:xuu6
    如链接失效可加QQ:1021288218 索取。

    参考:
    https://blog.csdn.net/yunyunyx/article/details/80473532

    展开全文
  • c#识别图片中的的数字和英文字母,有源码和例子 ..
  • WebPlotDigitizer - 基于HTML5的在线工具从绘图图像中提取数字数据
  • matlab程序,演示了数字水印的添加以及提取,含有干扰1--添加白噪声,2--高斯低通滤波,3--JPEG 压缩,4--图像剪切,5--旋转10度测设程序,下载既可以使用
  • 里面有具体实现代码以及图片资源,需要的可以下载
  • MATLAB--基于BP神经网络的手写数字识别

    千次阅读 多人点赞 2020-03-06 21:12:13
    MATLAB–基于BP神经网络的手写数字识别 在干活的过程中整理下来的,希望对大家有帮助。 手写数字识别技术作为图像处理和模式识别中的研究热点,在大...该方法的基本思想来源于以下两方面:一是手写数字图片中黑色像...

    MATLAB–基于BP神经网络的手写数字识别

    在干活的过程中整理下来的,希望对大家有帮助。
    手写数字识别技术作为图像处理和模式识别中的研究热点,在大规模数据统计(如行业年检、人口普查等)、票据识别、财务报表、邮件分拣等方面有着广泛的应用。目前手写数字识别技术也有很多种实现方法,这里介绍与本章内容相关的一种基于BP神经网络的手写数字识别方法。该方法的基本思想来源于以下两方面:一是手写数字图片中黑色像素点和白色像素点之间的空间编排关系构成了我们看到的数字,也就是说图片像素点的空间排布和输出的识别结果之间存在着非线性的映射关系。二是BP神经网络刚好就能解决非线性映射的数学建模问题。如果对像素点空间排布与输出数字之间的关系进行学习、训练,建立有效的人工神经网络,就可对再次给出的手写数字图片进行识别,输出识别结果。
    手写数字的识别就是利用计算机自动识别人手写在纸张上的阿拉伯数字,如果输入以下手写数字图片,则计算机输出对应识别结果为:0、1、2、3、4、5、6、7、8、9。
    手写数字图片截图
    进行手写数字识别时,先要对读取图片进行预处理,包括去噪、二值化等,再进行特征提取。特征提取的方法很多,这里采用一种简单的特征提取方法,即统计每个小区域中图像像素所占百分比作为特征数据。提取特征后再创建、训练BP神经网络模型,最后用测试数据进行测试。
    要进行手写数字识别这个实际问题,第一步就是建立手写数字的模型。

    1.手写数字识别非线性数学的模型建立

    BP神经网络即误差反向传播神经网络,可解决有教师训练的非线性数学建模问题。模型的建立主要包括:BP神经网络的创建、BP神经网络的训练以及BP神经网络的测试三步。
    创建BP神经网络前首先要确定网络的输入、输出。

    (1)BP神经网络的输入、输出

    BP神经网络的输入数据是手写数字样本经过预处理和特征提取后的数据。而为了BP神经网络的输入,我们肯定要先读入手写数字的样本,这里我们使用最通用的MNIST手写数字库,这个数据库直接在百度上就能下载到,该数据库包含0-9这10个数字的手写体,放在10个文件夹里,文件夹的名称对应存放的手写数字图片的数字,每个数字500张,每张图片的像素统一为28×28。
    下面介绍用MATLAB程序实现读入手写数字的样本,这里注意,我将手写数字的样本放在和MATLAB 程序同根目录的文件夹里,文件夹的名称对应存放的手写数字图片的数字,也就是说当前文件夹如下图所示。画红线的文件夹就是我们要读入的手写数字的样本,以数字0为例,数据库中图片的名称如下图所示。
    来自我的MATLAB截图
    来自我的MATLAB截图
    这样就可以用在主程序中调用read_train子函数读入手写数字的样本了。

    这里需要说明的是,我的MATLAB程序来自于:
    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
    本文链接:https://blog.csdn.net/zxm_jimin/article/details/87937652
    ————————————————
    版权声明:本文为CSDN博主「zxm_」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/zxm_jimin/article/details/87937652
    这里主要介绍我在学习这段MALTLAB程序的时候,学到的内容。

    main.m的MATLAB如下。

    clc;
    clear all;
    close all;
    %% 读取图像
    root='./data';
    img=read_train(root);
    %% 提取特征
    img_feature=feature_lattice(img);
    %% 构造标签
    class=10;
    numberpclass=500;
    ann_label=zeros(class,numberpclass*class);
    ann_data=img_feature;
    for i=1:class
     for j=numberpclass*(i-1)+1:numberpclass*i
         ann_label(i,j)=1;
     end
    end
    
    %% 选定训练集和测试集
    k=rand(1,numberpclass*class);  
    [m,n]=sort(k);  
    ntraindata=4500;
    ntestdata=500;
    train_data=ann_data(:,n(1:ntraindata));
    test_data=ann_data(:,n(ntraindata+1:numberpclass*class));
    train_label=ann_label(:,n(1:ntraindata));
    test_label=ann_label(:,n(ntraindata+1:numberpclass*class));
    %% BP神经网络创建,训练和测试
    net=network_train(train_data,train_label);
    predict_label=network_test(test_data,net);
    %% 正确率计算
    [u,v]=find(test_label==1);
    label=u';
    error=label-predict_label;
    accuracy=size(find(error==0),2)/size(label,2)
    

    read_train子函数的MATLAB如下。

    function [imglist] = read_train(root)
    % ni为读取图片张数,n为文件夹数目
    %========读取文件夹========%
    out_Files = dir(root);%展开
    tempind=0;
    imglist=cell(0);
    n=length(out_Files);
    %========读取文件========%
    for i = 1:n
        if strcmp(out_Files(i).name,'.')|| strcmp(out_Files(i).name,'..')
        else
            rootpath=strcat(root,'/',out_Files(i).name);
            in_filelist=dir(rootpath);
            ni=length(in_filelist);
            for j=1:ni
                if strcmp(in_filelist(j).name,'.')|| strcmp(in_filelist(j).name,'..')|| strcmp(in_filelist(j).name,'Desktop_1.ini')|| strcmp(in_filelist(j).name,'Desktop_2.ini')
                else
                    tempind=tempind+1;
                    imglist{tempind}=imread(strcat(rootpath,'/',in_filelist(j).name));
                end
            end
        end
    end
    end
    

    在这个子程序的4行dir函数可以获得指定文件夹下的所有子文件夹和文件,并存放在文件结构体数组中。返回值out_Files是一个struct—结构体,我们可以在工作区查看它,如下图。来自我的MATLAB截图
    在第10行函数strcmp()用于做字符串的比较,
    如调用格式为:TF=strcmp(s1,s2);
    则如果字符串s1和s2是一致的,则返回值TF=1,否则,TF=0。
    在第12行函数strcat(),用于横向连接字符串。如调用格式为:combinedStr= strcat(s1, s2, …, sN),就是将数组 s1,s2,…,sN 水平地连接成单个字符串,并保存于变量combinedStr中。在这里就是讲文件夹的路径和文件夹名横向连接。
    也就是说从10到13行,就是对于每一个文件夹中文件读入in_filelist这个结构体。而在n_filelist这个结构体中,比如对于”9”这个文件夹,每个图片的名称就是9_1,9_2,等等,从下边的一小块截图就可以看出来。
    来自我的MATLAB截图
    从15到21行,同样用到了函数strcmp()和函数strcat(),然后调用imread,也就是根据每个文件的路径及文件名,依次读入到imglist这个cell-元胞数组中,从而完成5000张图片的读入。

    在我们这个例子预处理主要是图像的二值化,特征提取方法主要采用粗网格特征提取。粗网格特征提取方法是指将二值化后的图像大小统一为50×50,再等分成5×5个网格,每个网格包含100像素,然后依次统计每个网格中黑色像素点的数量,从而得到一个1×25的特征向量。
    也就是说5000张手写数字图片的特征向量即为BP神经网络的输入(一个5000×25的矩阵),而其对应的真实数字为BP神经网络的输出(一个5000×1的向量)。
    图像预处理及特征提取的MATLAB通过在主程序中调用feature_lattice子函数来实现,其MATLAB如下。

    function feature = feature_lattice(img)
    % 输入:黑底白字的二值图像。输出:25维的网格特征
    % ======提取特征,转成5*5的特征矢量,把图像中每10*10的点进行划分相加,进行相加成一个点=====%
    %======即统计每个小区域中图像象素所占百分比作为特征数据====%
    for i=1:length(img);
    bw2=im2bw(img{i},graythresh(img{i}));
    bw_7050=imresize(bw2,[50,50]);
    for cnt=1:5
        for cnt2=1:5
            Atemp=sum(bw_7050(((cnt*10-9):(cnt*10)),((cnt2*10-9):(cnt2*10))));%10*10box
            lett((cnt-1)*5+cnt2)=sum(Atemp);
        end
    end
    lett=((100-lett)/100);
    lett=lett';
    feature(:,i)=lett;
    end
    

    首先该子程序的第5行,在MATLAB中将图像转换为二值图像,调用MATLAB中的im2bw函数。
    对于灰度图像,调用的格式如下。
    bw=im2bw(I,level);
    level空着的话,默认是0.5。level一般使用graythresh函数来计算,graythresh函数是MATLAB中自带的,函数功能:使用最大类间方差法找到图片的一个合适的阈值–level,
    第6行,调用imresize将图像大小统一为50×50。
    接着,从8-13行,用嵌套的for循环语句,将图像分成5×5个网格,也就是说每个网格是10×10个像素点,然后统计每个网格中不为0的像素点的数量。
    15行100-left就是每个网格中为0的像素点(黑色)的数量
    第16行通过一个转置操作,保证每个图像的特征是一个列向量。
    这样通过调用feature_lattice子函数,每一张图片都有1×25的特征向量。

    提取完特征后,将数据打上标签,这段程序是主程序的10-18行。
    因为数据一共10类,每类500张图片,先初始化一个用于存放标签的矩阵,这个矩阵大小就是10×(10×500)。
    我用图画了一下这个存放标签的矩阵是什么样。
    自己画的
    如果一个图片的标签是[1;0;0;0;0;0;0;0;0;0],那么这张图片上的数字是1,如果标签是[0;1;0;0;0;0;0;0;0;0], 那么这张图片上的数字是2,以此类推。
    因为我们数字图片是根据文件名读入的,这样图片上的数字、文件名和标签就都对应上了。

    最后随机选取4500张图片作为训练样本,500张图片作为测试样本。MATLAB是主程序的21-28行。提取的特征在ann_data中,也就是BP神经网络的输入,标签在ann_label中,也就是BP神经网络的输入输出。这样,我们就将BP神经网络的输入、输出准备好了。就可以开始创建BP神经网络了。

    (2)BP神经网络的创建

    BP神经网络具有输入层、隐含层(隐藏层)和输出层的三层结构。其中,隐含层可以有一个或两个及以上,这里采用具有一个隐含层的基本BP网络模型,隐含层神经元个数选取25个,激励函数选取默认的Sigmoid函数,学习速率设为0.1,网络训练函数选取默认的Trainlm,网络目标误差设为0.001。随机抽取4500张图片提取的特征矩阵作为训练样本的输入,计算隐含层和输出层输出、误差,更新网络权值。当误差达到设定目标时,网络的学习过程就结束。在main.m中调用network_train子函数,其MATLAB程序如下。

    function net = network_train(train_data,train_label )
    % BP网络训练
    % 初始化网络结构
    layer=30;%隐含层个数
    net=newff(train_data,train_label,layer);%创建网络
    net.trainParam.epochs=10;%迭代次数
    net.trainParam.lr=0.2;%学习率
    net.trainParam.goal=0.001;%误差参数
    net.trainFcn='trainrp';%训练方法
    % 网络训练
    net=train(net,train_data,train_label);
    end
    

    这样我们得到了训练好哒神经网络net。

    (3)神经网络的测试

    训练好神经网络之后,用随机抽取的500张手写数字图片对网络进行测试,输入特征向量,计算隐含层和输出层输出,得到最后测试的数据。同时计算每个数字的正确率和全体的正确率。在主程序中调用network_test子函数,其MATLAB程序如下。

    function out = network_test(test_data,net)
    % 输入:测试数据的特征和真值。输出:测试数据的label以及误差图
    % BP网络预测
    an=sim(net,test_data);
    for i=1:length(test_data)
        out(i)=find(an(:,i)==max(an(:,i)));
    end
    end
    

    测试数据的标签存在了predict_label中,可以在工作区双击predict_label,打开查看。如下所示。
    来着我的MATLAB截图
    正确率在命令行窗口可以看到。
    来着我的MATLAB截图
    另外,在网络训练的性能等可以点击下图中的按钮进行查看。这部分在上一篇介绍了,这里就不赘述了。
    来着我的MATLAB截图

    手写数字的数据集,data,我存放在百度网盘里了。
    data的提取链接

    展开全文
  • 图片提取文字

    2014-06-20 12:52:08
    一款从图片提取字符的简单软件 现只能识别英文和数字不支持中文 其中关键是调用AspriseOCR.dll文件
  • Wireshark提取离线包数据中的文件图片、视频等信息,通过wireshark lua插件来实现
  • 【图像处理】数字图像处理简介

    千次阅读 2019-12-20 10:36:34
    目录 1.介绍 2.模拟图像处理 3.数字图像处理 ...数字图像处理(Digital Image Processing)是通过计算机对图像进行去除噪声、增强、复原、分割、提取特征等处理的方法和技术。数字图像处理的产生...
  • matlab字符串数组、元胞数组提取数字背景示例代码 ...本方法会将字符串数组中每个字符串的数字提取出来,并转换成数字形式的新数组。 示例 原序列: 174行的元胞数组,内容格式为imgi.bmp(i为图片序号,为待提...
  • Matlab实现图像的轮廓提取

    万次阅读 2018-05-10 22:18:47
    以二值图像circles.png(黑色背景白色前景)为例,根据掏空内部点算法,运用Matlab编程实现二值图像的轮廓提取。 I=imread('circles.png'); [M,N]=size(I); buffer=I; for i=2:M-1 for j=2:N-1 if(I(i,j)==255&...
  • 嵌入提取数字水印程序,内附代码和测试图片,不足之处还请多多指教
  • 手写数字识别系统之数字提取

    千次阅读 2016-11-17 16:05:50
    引言所谓数字分割就是指将经过二值化后的图像中的单个数字区域进行提取的过程。数字分割在数字识别中是一个必不可少的关键步骤,只有能够将数字进行准确的提取,才能将其一一识别。数字分割的方法数字分割的方法相当...
  • 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 ...增加了 图片
  • mnist数据集图片提取出来

    千次阅读 2018-06-06 10:47:10
    # mnist数据集转成图片做测试,图片更为通用 import cv2 import os from keras.datasets import mnist import numpy as np str_1 = 'mnisttrain' str_2 = 'mnisttest' if os.path.exists(str_1): os...
  • C#中实现数字提取

    千次阅读 2018-09-18 09:12:36
    1:C#中实现数字提取 2:线段等分点获得方法
  • 基于opencv的数字识别

    万次阅读 多人点赞 2018-09-12 15:44:29
    最近学习了opencv,然后想通过其对图片上的数字进行识别,参考了网上几篇关于opencv数字识别的博客,我自己也写了一个程序玩玩。我是在vs2017和opencv3.4.1环境下实现的。  这里先说一下我的思路和步骤: 加载...
  • 20行Python代码爬取王者荣耀全英雄皮肤

    万次阅读 多人点赞 2019-11-21 22:01:03
    爬取皮肤本身并不难,难点在于分析,我们首先得得到皮肤图片的url地址,话不多说,我们马上来到王者荣耀的官网: 我们点击英雄资料,然后随意地选择一位英雄,接着F12打开调试台,找到英雄原皮肤的图片...
  • 图片特征提取

    千次阅读 2020-01-20 20:02:56
    数字图像通常是一张光栅图或像素图,将颜色映射到网格坐标里。一张图片可以看成是一个每个元素都是颜色值的矩阵。表示图像基本特征就是将矩阵每行连起来变成一个行向量。光学文字识别(Optical character recognit.....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 72,473
精华内容 28,989
关键字:

怎么把图片的数字提取出来