精华内容
下载资源
问答
  • 2022-03-27 21:55:20

    在有些数据集中,有些数据变量用字符串表示,但为了方便处理,往往想转换为好处理的格式,这时候不一定要用one hot进行编码,也可以直接转成整数:

    test_df["xx"] = pd.factorize(test_df["xx"])[0].astype(int)
    

    但是这样映射的数字是从0开始的,如果有初始要求,可以对映射结果加上某个值,例如,把从0开始变为从15开始:

    test_df["xx"] = test_df["xx"].add(15)
    

    效果gift_cards["user_id"] = pd.factorize(gift_cards["user_id"])[0].astype(int)

               user_id         item_id  ratings        time
    0       B001GXRQW0   APV13CM0919JD      1.0  1229644800
    1       B001GXRQW0  A3G8U1G1V082SN      5.0  1229472000
    2       B001GXRQW0   A11T2Q0EVTUWP      5.0  1229472000
    3       B001GXRQW0   A9YKGBH3SV22C      5.0  1229472000
    4       B001GXRQW0  A34WZIHVF3OKOL      1.0  1229472000
    ...            ...             ...      ...         ...
    147189  B01H5PPJT4  A2K9WVQW9TLWNK      5.0  1536969600
    147190  B01H5PPJT4  A149ALSR6TPGF7      4.0  1536278400
    147191  B01H5PPJT4  A2Q066NZCQSCOR      5.0  1535500800
    147192  B01H5PPJT4  A1KJLWCW7XBS8I      5.0  1534550400
    147193  B01H5PPJT4   ANABUB0FRZXRM      5.0  1534204800
    
            user_id         item_id  ratings        time
    0             0   APV13CM0919JD      1.0  1229644800
    1             0  A3G8U1G1V082SN      5.0  1229472000
    2             0   A11T2Q0EVTUWP      5.0  1229472000
    3             0   A9YKGBH3SV22C      5.0  1229472000
    4             0  A34WZIHVF3OKOL      1.0  1229472000
    ...         ...             ...      ...         ...
    147189      858  A2K9WVQW9TLWNK      5.0  1536969600
    147190      858  A149ALSR6TPGF7      4.0  1536278400
    147191      858  A2Q066NZCQSCOR      5.0  1535500800
    147192      858  A1KJLWCW7XBS8I      5.0  1534550400
    147193      858   ANABUB0FRZXRM      5.0  1534204800
    

    很成功

    更多相关内容
  • A表示位置正确且数字正确,B表示数字正确而位置不正确。 二、功能要求: 1.本游戏显示这样的菜单: (1) 随机产生数据 (2) 用户输入数据 (3) 退出游戏 2.游戏成功与否都能返回主菜单 三、算法提示: 1.数据结构...
  • OpenCV&C++代码实现数字识别(字典+尺寸归一化+图像差值)

    作者:翟天保Steven
    版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

    实现原理

           数字识别是图像处理学在现实生活中较多的应用之一,比如车牌识别、银行卡号识别、执照识别、文档文字OCR识别等等。如何实现数字识别呢?目前最为流行的就是运用AI、机器学习等技术结合图像处理学,大量训练数据集,以实现智能且精确的识别。说到人工智能,很多人可能觉得它非常深奥和复杂,其实说白了它最底层的识别逻辑还是基于普通的图像分析,像特征提取、轮廓分析、比对分析等等,再在庞大的数据集中按照相似程度,分析出一个最可能的结果。

           本文提供了一种相对简单的思路来实现数字识别,适合初学图像处理的新人研究参考。该方法为字典法:首先对图像进行阈值二值化处理,并适当清理微小噪声区;再结合轮廓分析,分割识别图像中的图形区域(不一定全是数字,也可能有其他的图形),并将图形区域尺寸归一化;对字典数字图同样进行分割和尺寸归一化;运用图像差值法,将识别图像的子区域分别比对字典中所有的数字子图,取其中差值最低的数字作为识别数字,若识别完成所有的差值均高于阈值,则识别错误;最后,在原图中给识别成功的子区域绘制最小包围矩形,并在上方书写所识别的数字。

           下方介绍具体流程。

    具体流程

    1)读取识别图像的原图和灰度图,读取字典图(灰度图)。将灰度图和字典图进行二值化处理。

    cv::Mat src = imread("number.jpg");
    cv::Mat gray = imread("number.jpg",0);
    cv::Mat Template= imread("num.jpg", 0);
    	
    // 二值化
    cv::Mat thresh,thresh_t;
    cv::threshold(gray, thresh, 200, 255, THRESH_BINARY);
    cv::threshold(Template, thresh_t,200, 255, THRESH_BINARY);
    图1 识别图像二值图

    图2 字典二值图

    2)若识别图像中数字为深色,背景为白色,则反相;若同字典类似,数字为白,背景为黑,则不动。

    // 反相
    vector<Point> points;
    findNonZero(thresh, points);
    if (points.size() > (gray.rows*gray.cols / 2))
    {
    	thresh = 255 - thresh;
    }

    3)Clear_MicroConnected_Areas函数清除二值图中的微小噪声区,函数具体介绍见:

    OpenCV-清除小面积连通域_翟天保的博客-CSDN博客

    4)确认识别图像和字典图的轮廓区。

    // 寻找轮廓
    vector<vector<Point>> contour,contour_t;
    vector<Vec4i> hierarchy, hierarchy_t;
    findContours(thresh, contour, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_NONE);
    findContours(thresh_t, contour_t, hierarchy_t, RETR_EXTERNAL, CHAIN_APPROX_NONE);

    5)用GetSubarea函数实现子区域提取。

    // 获取子区域集合
    vector<cv::Mat> GetSubarea(cv::Mat src, vector<vector<Point>> contour, vector<Vec4i> hierarchy)
    {
    	vector<cv::Mat> result;
    	if (!contour.empty() && !hierarchy.empty())
    	{
    		std::vector<std::vector<cv::Point> >::const_iterator itc = contour.begin();
    		// 遍历所有轮廓
    		while (itc != contour.end())
    		{
    			// 定位当前轮廓所在位置
    			cv::Rect rect = cv::boundingRect(cv::Mat(*itc));
    			cv::Mat temp = src(rect).clone();
    			result.push_back(temp);
    			itc++;
    		}
    	}
    	return result;
    }

    6)用UniformSize函数实现子区域尺寸归一化。

    // 统一尺寸
    vector<cv::Mat> UniformSize(vector<cv::Mat> in)
    {
    	vector<cv::Mat> result;
    	for (auto it = in.begin(); it != in.end(); ++it)
    	{
    		cv::Mat temp;
    		resize(*it,temp,Size(48,48));
    		result.push_back(temp);
    	}
    	return result;
    }

    7)用NumberRecognition函数实现数字识别。该函数输入四个参数,分别为识别图像原图、识别图像尺寸归一后子区域容器、字典图尺寸归一后子区域容器和阈值参数。其中阈值参数用来判断两图的差异性。

    // 数字识别
    cv::Mat NumberRecognition(cv::Mat Thresh, vector<cv::Mat> sub_size, vector<cv::Mat> sub_t_size, vector<vector<Point>> contour,int thresh)
    {
    	cv::Mat result = Thresh.clone();
    	for (int i = 0; i < sub_size.size(); ++i)
    	{
    		int min = 999999;
    		int idx = 0;
    		for (int j = 0; j < sub_t_size.size(); ++j)
    		{
    			int d = calcDiff(sub_size[i], sub_t_size[j]);
    			if (d < min)
    			{
    				min = d;
    				idx = j;
    			}
    		}
    		if (min < thresh)
    		{
    			cout << "第" << i + 1 << "个轮廓数字识别为:" << a[idx] << endl;
    			cv::Rect rect = cv::boundingRect(contour[i]);
    			rectangle(result, rect, Scalar(255,0,0), 1, 8);
    			putText(result, to_string(a[idx]), Point(rect.x, rect.y - 20), 1, 2, Scalar(0,0,255));
    		}
    		else {
    			cout << "第" << i + 1 << "个轮廓数字识别为: 空" << endl;
    		}
    	}
    	return result;
    }
    // 对比图像差值
    int calcDiff(cv::Mat src1, cv::Mat src2)
    {
    	CV_Assert(src1.size() == src2.size());
    	cv::Mat dif;
    	cv::absdiff(src1, src2, dif);
    	Scalar Sum=cv::sum(dif);
    	return int(Sum[0] / 255);
    }

    C++测试代码

    #include <opencv2/opencv.hpp>
    #include <iostream>
    #include <algorithm>
    #include <time.h>
    using namespace cv;
    using namespace std; 
    
    vector<cv::Mat> UniformSize(vector<cv::Mat> in);
    vector<cv::Mat> GetSubarea(cv::Mat src,vector<vector<Point>> contour, vector<Vec4i> hierarchy);
    int calcDiff(cv::Mat src1, cv::Mat src2);
    void Clear_MicroConnected_Areas(cv::Mat src, cv::Mat &dst, double min_area);
    cv::Mat NumberRecognition(cv::Mat Thresh, vector<cv::Mat> sub_size, vector<cv::Mat> sub_t_size, vector<vector<Point>> contour, int thresh);
    
    int a[10] = { 7,0,9,8,6,5,4,3,2,1 };
    
    int main()
    {
    	cv::Mat src = imread("number.jpg");
    	cv::Mat gray = imread("number.jpg",0);
    	cv::Mat Template= imread("num.jpg", 0);
    	
    	// 二值化
    	cv::Mat thresh,thresh_t;
    	cv::threshold(gray, thresh, 200, 255, THRESH_BINARY);
    	cv::threshold(Template, thresh_t,200, 255, THRESH_BINARY);
    
    	// 反相
    	vector<Point> points;
    	findNonZero(thresh, points);
    	if (points.size() > (gray.rows*gray.cols / 2))
    	{
    		thresh = 255 - thresh;
    	}
    
    	// 清除噪声区
    	Clear_MicroConnected_Areas(thresh, thresh, 200);
    
    	// 寻找轮廓
    	vector<vector<Point>> contour,contour_t;
    	vector<Vec4i> hierarchy, hierarchy_t;
    	findContours(thresh, contour, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_NONE);
    	findContours(thresh_t, contour_t, hierarchy_t, RETR_EXTERNAL, CHAIN_APPROX_NONE);
    
    	// 分割子区域
    	vector<cv::Mat> sub = GetSubarea(thresh, contour, hierarchy);
    	vector<cv::Mat> sub_t = GetSubarea(thresh_t, contour_t, hierarchy_t);
    
    	// 子区域尺寸统一化
    	vector<cv::Mat> sub_size = UniformSize(sub);
    	vector<cv::Mat> sub_t_size = UniformSize(sub_t);
    
    	// 数字识别(字典法比对)
    	int t = 400;
    	cv::Mat result = NumberRecognition(src, sub_size, sub_t_size, contour, t);
    
    	imshow("original", src);
    	imshow("thresh", thresh);
    	imshow("result", result);
    	waitKey(0);
    	return 0;
    }
    
    // 获取子区域集合
    vector<cv::Mat> GetSubarea(cv::Mat src, vector<vector<Point>> contour, vector<Vec4i> hierarchy)
    {
    	vector<cv::Mat> result;
    	if (!contour.empty() && !hierarchy.empty())
    	{
    		std::vector<std::vector<cv::Point> >::const_iterator itc = contour.begin();
    		// 遍历所有轮廓
    		while (itc != contour.end())
    		{
    			// 定位当前轮廓所在位置
    			cv::Rect rect = cv::boundingRect(cv::Mat(*itc));
    			cv::Mat temp = src(rect).clone();
    			result.push_back(temp);
    			itc++;
    		}
    	}
    	return result;
    }
    
    // 统一尺寸
    vector<cv::Mat> UniformSize(vector<cv::Mat> in)
    {
    	vector<cv::Mat> result;
    	for (auto it = in.begin(); it != in.end(); ++it)
    	{
    		cv::Mat temp;
    		resize(*it,temp,Size(48,48));
    		result.push_back(temp);
    	}
    	return result;
    }
    
    // 对比图像差值
    int calcDiff(cv::Mat src1, cv::Mat src2)
    {
    	CV_Assert(src1.size() == src2.size());
    	cv::Mat dif;
    	cv::absdiff(src1, src2, dif);
    	Scalar Sum=cv::sum(dif);
    	return int(Sum[0] / 255);
    }
    
    // 清除小区域
    void Clear_MicroConnected_Areas(cv::Mat src, cv::Mat &dst, double min_area)
    {
    	// 备份复制
    	dst = src.clone();
    	std::vector<std::vector<cv::Point> > contours;  // 创建轮廓容器
    	std::vector<cv::Vec4i> 	hierarchy;
    
    	// 寻找轮廓的函数
    	// 第四个参数CV_RETR_EXTERNAL,表示寻找最外围轮廓
    	// 第五个参数CV_CHAIN_APPROX_NONE,表示保存物体边界上所有连续的轮廓点到contours向量内
    	cv::findContours(src, contours, hierarchy, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE, cv::Point());
    
    	if (!contours.empty() && !hierarchy.empty())
    	{
    		std::vector<std::vector<cv::Point> >::const_iterator itc = contours.begin();
    		// 遍历所有轮廓
    		while (itc != contours.end())
    		{
    			// 定位当前轮廓所在位置
    			cv::Rect rect = cv::boundingRect(cv::Mat(*itc));
    			// contourArea函数计算连通区面积
    			double area = contourArea(*itc);
    			// 若面积小于设置的阈值
    			if (area < min_area)
    			{
    				// 遍历轮廓所在位置所有像素点
    				for (int i = rect.y; i < rect.y + rect.height; i++)
    				{
    					uchar *output_data = dst.ptr<uchar>(i);
    					for (int j = rect.x; j < rect.x + rect.width; j++)
    					{
    						// 将连通区的值置0
    						if (output_data[j] == 255)
    						{
    							output_data[j] = 0;
    						}
    					}
    				}
    			}
    			itc++;
    		}
    	}
    }
    
    // 数字识别
    cv::Mat NumberRecognition(cv::Mat Thresh, vector<cv::Mat> sub_size, vector<cv::Mat> sub_t_size, vector<vector<Point>> contour,int thresh)
    {
    	cv::Mat result = Thresh.clone();
    	for (int i = 0; i < sub_size.size(); ++i)
    	{
    		int min = 999999;
    		int idx = 0;
    		for (int j = 0; j < sub_t_size.size(); ++j)
    		{
    			int d = calcDiff(sub_size[i], sub_t_size[j]);
    			if (d < min)
    			{
    				min = d;
    				idx = j;
    			}
    		}
    		if (min < thresh)
    		{
    			cout << "第" << i + 1 << "个轮廓数字识别为:" << a[idx] << endl;
    			cv::Rect rect = cv::boundingRect(contour[i]);
    			rectangle(result, rect, Scalar(255,0,0), 1, 8);
    			putText(result, to_string(a[idx]), Point(rect.x, rect.y - 20), 1, 2, Scalar(0,0,255));
    		}
    		else {
    			cout << "第" << i + 1 << "个轮廓数字识别为: 空" << endl;
    		}
    	}
    	return result;
    }

    测试效果

    图3 原图
    图4 阈值图
    图5 识别结果

           不难看出,字典的丰富性影响了识别的准确程度,当字体同字典数字字体类似,即使数字压缩变形也能识别出来,反之则不行。画了个圆识别为了0,emm哈哈哈。手写体用字典法很难做到,毕竟千人千样,字典量过大,程序计算时间就飞上去了。所以,该方法适合标准数字类型,即使是车牌或者信用卡卡号这种,只要提前做好字典都是可以实现的。

           如果函数有什么可以改进完善的地方,非常欢迎大家指出,一同进步何乐而不为呢~

           如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!

    展开全文
  • 图解数字签名过程

    千次阅读 2018-05-27 20:58:13
    数字签名,它的作用跟手写签名其实是一样的,用来证明某个消息或者文件是本人发出/认同的,利用公钥加密系统保证不可伪造和不可抵赖两个特性 使用的签名算法有: RSA,基于大整数分解问题 DSA,基于离散对数问题 ...

    数字签名,它的作用跟手写签名其实是一样的,用来证明某个消息或者文件是本人发出/认同的,利用公钥加密系统保证不可伪造不可抵赖两个特性
    使用的签名算法有:

    RSA,基于大整数分解问题
    DSA,基于离散对数问题
    ECDSA,属于DSA的一个变种,基于椭圆曲线上的离散对数问题

    我们以RSA做简单分析,如果你生成了一对RSA密钥,你把公钥公布出去,并告诉别人这个公钥是你的。之后你只要在发送的消息后面加上用私钥加密过的密文,其他人拿公钥解密,看解密得到的内容是不是你发的内容,就可以知道这个内容是不是你发的。
    那么怎么体现两大特性呢?

    不可伪造

    其他人因为没有对应的私钥,所以没法生成公钥可以解密的密文,所以是不可伪造的。

    不可抵赖

    又因为公钥对应的私钥只有一个,所以只要能成功解密,那么发消息的一定是你,不会是其他人,所以是不可抵赖的。

    具体签名过程如下
    一个具体的RSA签名过程如下:
    1.服务器外发布公钥,并声明对应的私钥在自己手上
    2.服务器对消息M计算摘要,得到摘要D
    3.服务器使用私钥对D进行签名,得到签名S
    4.将M和S一起发送出去
    验证过程如下:
    1客户端首先对M使用跟服务器一样的摘要算法计算摘要,得到摘要D
    2.使用服务器公钥对S进行解签,得到摘要D’
    3.如果D和D’相同,那么证明M确实是服务器发出的,并且没有被篡改过
    数字签名过程图by hj

    用到的部分名词解释

    消息摘要:

    消息摘要就是将消息哈希转换成一个固定长度的值唯一的字符串,该过程不可逆,基本上做不到通过消息摘要转换成消息的。
    实际应用中,由于直接对原消息进行签名有安全性问题,而且原消息往往比较大,直接使用RSA算法进行签名速度会比较慢,所以我们一般对消息计算其摘要(使用SHA-256等安全的摘要算法),然后对摘要进行签名。只要使用的摘要算法是安全的(MD5、SHA-1已经不安全了),那么这种方式的数字签名就是安全的。

    非对称加密:

    在通信双方,如果使用非对称加密,一般遵从这样的原则:公钥加密,私钥解密。同时,一般一个密钥加密,另一个密钥就可以解密。
    因为公钥是公开的,如果用来解密,那么就很容易被不必要的人解密消息。因此,私钥也可以认为是个人身份的证明。
    如果通信双方需要互发消息,那么应该建立两套非对称加密的机制(即两对公私钥密钥对),发消息的一方使用对方的公钥进行加密,接收消息的一方使用自己的私钥解密。

    展开全文
  • 基于FPGA的数字识别实现

    千次阅读 多人点赞 2019-07-21 17:30:34
    本篇博客就将介绍数字识别的方法,由于只是研究数字识别的方法,我们就不用硬件平台,而是用Modelsim和Matlab来仿真验证。 具体方法如下: 我们用画图软件将带有数字的图片截取为640x480像素,为了和我们将来要使用...

    前言

    数字识别在我们生活中很常见,比如车牌识别。本篇博客就将介绍数字识别的方法,由于只是研究数字识别的方法,我们就不用硬件平台,而是用Modelsim和Matlab来仿真验证。
    具体方法如下:

    1. 我们用画图软件将带有数字的图片截取为640x480像素,为了和我们将来要使用的摄像头的分辨率一样。
    2. 利用Matlab将图片读取出来,生成一个txt文档
    3. 用Modelsim读取第二步生成的txt文档,做为数据源。然后做二值化,二值化后的数据只有8‘hff和8’h00两种,8’hff是背景色,8’h00是数字的数据。具体识别过程后面代码具体分析。

    准备工作

    1. 带数字的图片(640x480)
    2. Matlab软件
    3. Modelism软件

    数字识别原理介绍

    代码为本博客作者原创,识别原理借鉴lee神博客。为了对原创作者的付出表示感谢,特分享数字识别原文链接:
    https://www.cnblogs.com/leegod/p/8929678.html
    1.1基于FPGA的数字识别的方法

    通常,针对印刷体数字识别使用的算法有:基于模版匹配的识别方法、基于BP 神经网络的识别方法、基于数字特征的识别方法等。下文将对这几种算法进行讨论以及比较。
    1>模版匹配法
    模版匹配法是一种被较早应用的数字识别算法,该算法的关键是对所要识别
    的所有数字进行模版构建,之后将图像中的数字与所有的数字模版一一进行比较,
    计算出图像中数字与每个模版的相似度,根据所计算出的相似度结果进行识别。
    其中相似度最高的模版即为我们所要识别的结果。模版匹配法的对数字的大小、
    结构形状的规范化程度要求很高,数字的规范化程度对识别的准确率有着直接的
    影响。该算法原理较为简单,但计算复杂度过大,同时不利于 FPGA 的实现。
    2>神经网络识别算法
    神经网络识别的方法是模仿动物神经网络的特征,对信息进行分布式并行处
    理的一种算法。神经网络识别算法具有一定的抗干扰能力,但为了保证识别的准
    确率,该算法需要负责并且大量的计算,来对神经网络进行训练,而过于复杂的
    计算不利于 FPGA 对该算法的实现。
    3>数字特征识别算法
    基于数字特征的识别算法其核心是通过对数字的形状以及结构等几何特征
    进行分析与统计,通过对数字特征的识别从而达到对图像中数字的识别。

    1.2 基于数字特征算法实现数字识别

    我们采用基于数字特征的算法进行数字的识别,通过图像采集模块采集到图像,进行灰度化,二值化,然后进行数字特征的提取和统计来完成对数字的识别,最终显示到数码管上,完成图像信息到数字信息的转化。
    在这里插入图片描述
    图1 0-6 数字特征标线
    在这里插入图片描述
    图2 7-9 数字特征标线
    在这里插入图片描述
    图3 5数字特征

    数字特征信息的提取基于打印体,如上图1,图2,图3所示,以图3数字5举例,红框是数字5的水平和竖直的上下左右边界。X1在竖直方向的2/5处的水平线,x2在竖直方向的2/3处的水平线,y在水平方的1/2处的水直线。我们以此特征来统计x1,x2,y与数字5的交叉点。

    以交叉统计法来区分0-9数字的特征如下表1:
    表1 0-9数字特征统计表
    在这里插入图片描述
    在这里插入图片描述
    由于2,3,5的数字特征统计表一样,无法区分所以我们继续增加数字特征以区分2,3,5。如表2:
    表2 2,3,5 数字特征统计
    在这里插入图片描述
    这样通过数字统计完全区分开数字0-9。然后利用FPGA系统搭建实时数字识别系统。

    Matlab主要程序分析

    本项目,我们以识别数字2为例,原始图片如下:
    在这里插入图片描述
    im1=imread('D:\work\XYUE\zhuanti\IMAGE_PROCESS\Number_shi\Matlab\2.png'); %读取图片
    x=rgb2gray(im1);%将原图转为灰度图
    imshow(im1);%显示原图
    imshow(x);%显示灰度图

    fid=fopen('Num_dec.txt','wt');%需要生成10进制的数据文件,Matalb才能正确识别
    fid_hex=fopen('Num_hex.txt','wt');%需要生成16进制的数据文件,Modelsim才能正确识别
    [row,col]=size(x);
    for i=1:1:row
    	for j=1:1:col
    		if(j==col)
    			if(x(i,j)>100)%判断阈值,将灰度图进行二值化
    				fprintf(fid,'%02d\n',255);
    			else
    				fprintf(fid,'%02d\n',0);
    			end
    		else
    			if(x(i,j)>100)%判断阈值,将灰度图进行二值?
    				fprintf(fid,'%02d\t',255);
    			else 
    				fprintf(fid,'%02d\t',0);
    			end
    		end
    	end
    end
    
    aa=textread('Num_dec.txt');
    imshow(aa);%显示二值化后的图片
    
    %%%将modelsim仿真生成的带边界的数据文件转换成640x480矩阵,并将其显示出来
    aa=textread('D:\work\XYUE\zhuanti\IMAGE_PROCESS\Number_shi\FPGA\Sim\do\FPGA_MID_307200.txt');
    fid1=fopen('Num_hex_bianjie.txt','wt');
    fid1_dec=fopen('Num_dec_bianjie.txt','wt');
    row=480;
    col=640;
    for i=1:1:row
    	for j=1:1:col
    		if(j==col)
    			fprintf(fid1,'%02x\n',aa((i-1)*col+j));
    		else
    			fprintf(fid1,'%02x\t',aa((i-1)*col+j));
    		end
    	end
    end
    for i=1:1:row
    	for j=1:1:col
    		if(j==col)
    			fprintf(fid1_dec,'%d\n',aa((i-1)*col+j));
    		else
    			fprintf(fid1_dec,'%d\t',aa((i-1)*col+j));
    		end
    	end
    end
    aa=textread('Num_dec_bianjie.txt');
    imshow(aa,[]);%注意要加[],否则matlab没办法按数据等级来显示颜色,造成的结果是看不到边框
    

    Matlab效果图片显示

    在这里插入图片描述

    FPGA主要模块思路分析

    FPGA部份主要分为以下几个主要模块:

    模块一

    在这里插入图片描述
    该模块主要读取matlab生成的图片数据,接口定义见图上说明

    模块二

    在这里插入图片描述
    边界检测原理分析:背景数据为8’hff,数字数据为8’h00,所以如果检测到数据由8’hff变为00,那说明检测到了左边界,由于数字中间有镂空,所以我们会检测到很多左边界,这时就要做一个大小比较,当得到的所有左边界中最小的那个数,便是我们数字的左边界坐标,其余坐标检测与之类似。具体代码如下:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    模块三

    在这里插入图片描述
    边界显示的原理分析:边界检测模块检测出了上下左右的坐标,当行数计数到上边界时,同时列计数在左右边界之间时,将该行的图像数据替换为边界数据(8’h55)。其实边界与上边界处理方法类似。具体代码如下:
    在这里插入图片描述

    模块四

    在这里插入图片描述
    在这里插入图片描述
    识别原理简单图示:
    在这里插入图片描述

    模块五

    在这里插入图片描述

    FPGA仿真波形分析

    在这里插入图片描述
    从上面的仿真图中,我们最后识别出了图片中的数字,num=2。

    结语

    该项目,我们通过Matlab结合FPGA仿真,实现了静态数字的识别,最终仿真验证成功。并且摆脱了硬件的限制,在无硬件的条件下,我们仍然可以进行图像处理相关的学习。如果读者想要在硬件上验证,只需要对程序做稍微简单的修改即可,识别原理是一样的。花了一个下午写这一篇长博客,希望能起到抛砖引玉的作用,若有错误的地方,烦请指出,一起学习,一起进步!

    展开全文
  • 1.设计要求 1.1 主要设计要求 (1)设计一个开锁密码至少为4位数字(或更多)的密码锁。 (2)当开锁按扭开关(可设置8位或更多,其中只有4...(2)五秒计时采用倒计时(即从5s计时到0)的方式,将秒显示在开发板的七
  • 数字媒体技术考点整理

    千次阅读 多人点赞 2021-12-12 16:12:51
    北京化工大学数字媒体技术期末复习
  •  数字分析 分析一组数据,比如一组员工的出生年月,这时我们发现出生年月的前几位数字一般都相同,因此,出现冲突的概率就会很大,但是我们发现年月日的后几位表示月份和具体日期的数字差别很大,如果利用后面的几位...
  • 数字签名

    万次阅读 多人点赞 2020-02-26 08:54:09
    文章目录我们需要数字签名签名的生成和验证数字签名的方法直接对消息进行签名对消息的hash值进行签名数字签名可以替代现实生活中的签名吗?数字签名无法解决的问题 我们需要数字签名 之前的文章我们讲了MAC(Message...
  • 稀疏表示

    千次阅读 2018-12-28 20:34:00
     信号的稀疏表示并不是新的东西。我们很早就一直在利用这一特性。例如,最简单的JPEG图像压缩算法。原始的图像信号经过DCT变换之后,只有极少数元素是非零的,而大部分元素都等于零或者说接近于零。这就是信号的...
  • 浮点数在计算机中的表示

    万次阅读 多人点赞 2018-07-23 22:44:11
    1.1 浮点数在计算机中的表示 1.1.1 指数偏移值 1.1.2 规约浮点数[1] 1.1.3 非规约浮点数 1.2 单精度和双精度浮点数 1.3 浮点数转二进制 1.3.1 无小数浮点数转二进制表示 1.3.2 含小数浮点数转二进制表示 1.4 ...
  • tensorflow----MNIST手写数字识别问题

    千次阅读 2022-04-26 18:37:23
    在mnist数据集中,每一张图片都是用28*28的矩阵表示,且数字都会出现在图片的正中央,如下展示图片以及矩阵表示: MNIST 数据集来自美国国家标准与技术研究所, National Institute of Standards and Technology ...
  • 在计算机系统中,数值一律用补码来表示和存储。 原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。...一个在计算机中的二进制表示形式, 叫做这个的机器。机...
  • 本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算...一个在计算机中的二进制表示形式, 叫做这个的机器。机器是...
  • 根据2017年进行的数字化转型调查,64%的受访者表示数字化转型战略对于提高利润至关重要,70 %的受访者表示他们拥有物联网战略,高达75%的受访者表示他们拥有大数据策略。 物联网,人工智能和大数据都在推动企业...
  • 国外数字银行提前开户奖励2500刀?

    千次阅读 2022-03-15 11:17:05
    牙买加大力推进CBDC发展,为何历史和地理跟萨尔瓦多如此接近的美洲国家... Nigel Clarke博士表示,牙买加银行(BOJ) 在 2021 年 5 月至 2021 年 12 月期间成功开展试点后,全国 CBDC 计划于 4 月至 6 月季度开始。也就是
  • 三、交易所重要概念 3.1数字货币交易 数字货币交易就是买卖双方使用数字货币交换,每种数字货币都有自己的实时价格。交易会收费用,就像股票交易手续费,国家收印花税等,充提币时会收矿工费。 两者的区别在于:股票...
  • shell 中的通配符和正规表示法(正则表达式)
  • FPGA中正负数和定点小数的表示方法

    千次阅读 2020-09-22 12:21:13
    在日常生活中,我们常常需要到正数与负数,比如南北两级气温常年为零度以下,这个时候我们就需要负数来表示温度。那么在FPGA工程里面也是这样,我们如果想要做温度监测工程,自然而然的就会需要到负数来表达零下的...
  • 英语听力数字练习

    万次阅读 2019-02-20 19:56:58
    英语听力数字练习
  • 这一次,我们将进一步介绍【非对称加密算法】和【消息摘要算法】的综合应用:数字签名和消息验签。通过本文的阅读,你可以了解到以下知识: 数字签名是什么? 为什么数字签名采用非对称算法和信息摘要算法? 数字...
  • 目前我国央行推出的数字货币(DCEP)是基于区块链技术推出的全新加密电子货币体系。DCEP将采用双层运营体系,即人民银行先把DCEP兑换给银行或者是其他金融机构,再由这些...
  • JS数字存储问题

    2020-04-30 03:55:20
    数字存储 在对精度要求很高的系统中,或要对小数的运算结果进行比较时,...JS中表示的最大数字是多少? 最大连续整数 : 1~能掰手指头 window.Number.MAX_SAFE_INTEGER JS中能表示数字有效位数是多少? 16 ~ 17 位...
  • 神经网络实现手写数字识别(MNIST)

    万次阅读 多人点赞 2017-05-10 18:20:42
    神经网络实现迷宫游戏的思路,在本篇当中也写如何使用神经网络实现迷宫的,但是研究了一下, 感觉有些麻烦不太好弄,所以就选择了比较常见的方式,实现手写数字识别(所谓的MNIST)。 二、人工神经网络简介 ...
  • Bob 公钥的真实性和有效性 数字证书上有关于 Bob 身份的信息,用于核对 Bob 身份 还有 Bob 公钥的信息,例如过期时间、状态等,用于表示证书上的这个 Bob 的公钥处于什么状态 同时,数字证书上也有用证书颁发机构的...
  • NFT数字藏品在中国市场如何找到自己的“角色位”?
  • 暴走时评:央行推动的基于区块链的数字票据交易平台已测试成功,由央行发行的法定数字货币已在该平台试运行。作为一种创新的货币和全新的支付体系架构,央行数字货币具有长远的创新和发展的潜力,有可能对金融基础...
  • RSA算法和RSA数字签名算法

    万次阅读 2018-03-07 15:47:49
    一、引言 随着网络技术的飞速发展,信息安全性已成为亟待解决的问题。...另外,随着电子商务的发展,网络上资金的电子交换日益频繁,如何防止信息的伪造和欺骗也成为非常...目前关于数字签名的研究主要集中基于公钥...
  • 因此,手写数字的识别研究有着重大的现实意义,一旦研究成功并投入应用,将产生巨大的社会和经济效益。 1.3 手写数字识别的典型应用 手写数字识别有着极为广泛的应用前景,这也正是它受到世界各国的研究工作者重视...
  • BP神经网络识别手写数字项目解析及matlab实现

    万次阅读 多人点赞 2018-08-08 10:15:20
    %显示不成功数字,显示会比较花时间 % figure(incorrect_num) % imshow((1-photo_matrix)*255); % title(num2str(number)); end end end correct_rate=correct_num/test_number/test_num toc %计时结束   ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 444,752
精华内容 177,900
关键字:

一定成功的数字表示