基于特征匹配的英文印刷字符识别代码自己的注释
function MainForm
global bw;
global bl;
global bll;
global s;
global fontSize;
global charpic;
global hMainFig;
global pic;
global hText;clc; close all; warning off all;
%目录检,如果当前目录不存在pic文件,则创建
if ~exist(fullfile(pwd, 'pic'), 'dir')mkdir(fullfile(pwd, 'pic'));
end
picname = fullfile(pwd, 'image.jpg');
pic = imread(picname);%读取图片
s = size(pic); %计算图片尺寸--s为二维/三维矩阵
if length(s) == 3pic = rgb2gray(pic);%如果s是三维,表明是rgb图片,转为灰度
end
bw = im2bw(pic, 0.7);%二值化
bw = ~bw; %二值图像取反,将英文字母部分变为1,背景为0
for i = 1 : s(1) %扫描每一行if sum(bw(i,:) ~=0) > 0 %如果找到一行的所有像素加起来>0FontSize_s = i; %表明从这行开始有字,前面均为空白break;end
endfor i = FontSize_s : s(1) %从有字的那行像素开始扫描if sum(bw(i,:) ~=0) == 0 %直到有一行的所有像素加起来得0FontSize_e = i; %表明从这行之后为空白break;end
end
FontSizeT = FontSize_e - FontSize_s;%字体的高度
fontName = '宋体';
fontSize = FontSizeT;bw1 = imclose(bw, strel('line', 4, 90));%对图像进行闭运算,先加粗再细化
%figure,imshow(bw1);
bw2 = bwareaopen(bw1, 20);%删除bw1中面积小于20的对象
bwi2 = bwselect(bw2, 368, 483, 4);%选中一个对象,在图像中是问号的所在位置,绝对是个大缺陷!
bw2(bwi2) = 0;%令此对象=0,即删除问号
bw3 = bw .* bw2;%过滤掉标点符号
bw4 = imclose(bw3, strel('square', 4));%闭运算,把单词闭合成一个区域% figure,imshow(bw);
% figure,imshow(bw2);
% figure,imshow(bwi2);
% figure,imshow(bw3);
% figure,imshow(bw4);[Lbw4, numbw4] = bwlabel(bw4);%把每个单词(此时已连通)贴上标签%Lbw4为贴标签之后的矩阵,numbw4为标签(即单词)个数
stats = regionprops(Lbw4);%获取区域的某个属性(面积、最小包围矩形的坐标长宽等)的值
%imshow(bw);hold on;
for i = 1 : numbw4tempBound = stats(i).BoundingBox;%获取每个连通区域的最小矩形(左上角坐标、长宽)%rectangle('position',tempBound,'edgecolor','r');tempPic = imcrop(pic, tempBound);%在原图中,剪裁单词区域tempStr = fullfile(pwd, sprintf('pic\\%03d.jpg', i));%获取存放路径,将剪裁单词命名imwrite(tempPic, tempStr);%将剪裁的单词命名保存
end[bl, num] = bwlabel(bw1, 4);%bw1为粗化后未去标点,未连通的单词
chars = [char(uint8('A'):uint8('Z')), uint8('a'):uint8('z'), uint8('0'):uint8('9')];
%chars保存26个大写字母和小写字母以及0~9数字
eleLen = length(chars);%26+26+10=62
charpic = cell(1,eleLen);%创建62个数组
%%%%%%%%以下先生成宋体的字符集的图片,然后截图保存,用于后面的匹配%%%%%%%%%%%%%%%%%%
%hf1 = figure('Visible', 'Off');%后台建立窗口,不显示,返回窗口句柄
hf1 = figure;
%%%%set (gcf,'Position',[400,100,300,300], 'color','y')
imshow(zeros(40,40));%建立一块0矩阵,以下在空矩阵上写出一个宋体18号的字母'a'
h = text(15, 15, 'a', 'Color', 'w', 'Fontname', fontName, 'FontSize', fontSize);for p = 1 : eleLen %1到64set(h, 'String', chars(p));%fh = getframe(hf1,[85,58,30,30]);%截屏,此截屏方法不保证截到字符的全部(需改进)
% %%%%以下为改进%%%%%%%%%fh=getframe(hf1);%%%%%加temp = fh.cdata;%获取图像数据temp = im2bw(temp, graythresh(temp));[rt,ct]=find(temp==0);%%%(加)temp=temp(min(rt):max(rt),min(ct):max(ct));%%%加
%%%%%%%%以上为改进%%%%%%[f1, f2] = find(temp == 1);%查找包含字符像素的坐标temp = temp(min(f1)-1:max(f1)+1,min(f2)-1:max(f2)+1);%分割出字符charpic{p} = temp;%保存字符
end
delete(hf1);%截图保存标准字符之后删除句柄
%%%%产生辨识区域,使得鼠标即使指向字符的空心位置也能准确指向字符%%%%%%%%%%
bll = zeros(size(bl));%bl为贴标签的未连通图
for i = 1:num %num为字母个数,非单词个数[f1, f2] = find(bl == i);bll(min(f1):max(f1), min(f2):max(f2)) = i;%包围了字符的整个矩形区域,不管空心实心
endhMainFig = figure(1);
imshow(picname, 'Border', 'loose'); hold on;%显示原图
for i = 1 : numbw4 %numbw4为单词个数tempBound = stats(i).BoundingBox;rectangle('Position', tempBound, 'EdgeColor', 'r');%使用矩形包围单词区域
end
hText = axes('Units', 'Normalized', 'Position', [0 0 0.1 0.1]); axis off;
set(hMainFig, 'WindowButtonMotionFcn', @ShowPointData);
endfunction ShowPointData(hObject, eventdata, handles)
global bw;
global bl;
global bll;
global s;
global charpic;
global hMainFig;
global pic;
global hText;p = get(gca,'currentpoint');%获取鼠标点击屏幕的点
x = p(3);%p为2X3矩阵,因为Matlab的坐标为三维坐标,虽然看着是二维
y = p(1);%等价于x=p(1,2),y=(1,1),(为何要xy对调???)
if x<1 || x>s(1) || y<1 || y>s(2)return;
end
curlabel = bll(uint32(x), uint32(y));
if curlabel ~= 0[f1, f2] = find(bl == curlabel);minx = min(f1);maxx = max(f1);miny = min(f2);maxy = max(f2);tempic = pic(minx:maxx, miny:maxy);%图片中字符位置temp = bw(minx:maxx, miny:maxy);%二值图像的字符分割出来保存到temptempIm = zeros(round(size(temp)*2));%创建一个比字符大2倍的0矩阵tempIm = logical(tempIm);%矩阵转为逻辑矩阵tempIm(round((size(tempIm, 1)-size(temp, 1))/2):round((size(tempIm, 1)-size(temp, 1))/2)+size(temp, 1)-1, ...round((size(tempIm, 2)-size(temp, 2))/2):round((size(tempIm, 2)-size(temp, 2))/2)+size(temp, 2)-1) = temp;set(0, 'CurrentFigure', hMainFig);imshow(tempIm, [], 'Parent', hText);mincost = 100000;mark = 1;for i = 1 : length(charpic)temp1 = charpic{i};ss = size(temp);temp1 = imresize(temp1, ss);tempcost = sum(sum(abs(temp - temp1)));if tempcost < mincostmincost = tempcost;mark = i;endend
end
end
基于特征匹配的英文印刷字符识别代码自己的注释相关推荐
- 第 09 章 基于特征匹配的英文印刷字符识别 MATLAB深度学习实战案例
基于特征匹配的英文印刷字符识别 MATLAB深度学习实战 话不多讲,直接开撸代码 MainForm函数 function MainForm global bw; global bl; global b ...
- 【MATLAB图像处理实用案例详解(6)】—— 基于特征匹配的英文印刷字符识别
目录 一.背景意义 二.理论基础 2.1 图像预处理 2.2 图像识别技术 2.2.1 统计特征字符识别技术 2.2.2 结构特征字符识别技术 2.2.3 基于机器学习的识别技术 三.效果演示 一.背 ...
- 【印刷字符识别】基于matlab特征匹配英文印刷字符识别【含Matlab源码 310期】
⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源: [印刷字符识别]基于matlab特征匹配英文印刷字符识别[含Matlab源码 310期] 获取代码方式2: 通过订阅紫极神光博客付费专栏 ...
- 视频+课件| PointDSC:基于特征匹配的点云配准方法(CVPR2021)
写在前面 感谢「3D视觉从入门到精通」知识星球嘉宾白旭阳博士为我们带来的主题为PointDSC:基于特征匹配的点云配准方法(CVPR2021)视频讲解,星球成员可免费观看学习.备注:白旭阳,香港科技大 ...
- 重磅直播 | PointDSC:基于特征匹配的点云配准方法(CVPR2021)
大家好,本公众号现已开启线上视频公开课,主讲人通过B站直播间,对3D视觉领域相关知识点进行讲解,并在微信群内完成答疑. 本期由香港科技大学计算机系白旭阳博士分享,分享的主题为<基于特征匹配的鲁棒 ...
- 水声信号混响matlab,基于特征匹配的复杂水声信号仿真模型验证方法
0引言由于实测目标回波.辐射噪声.海洋混响非常困难,在实验室重构这些复杂水声信号有着重要的意义.例如,在声自导鱼雷半实物仿真实验中,常采用目标回波.辐射噪声的仿真信号替代实测信号,由此产生了极大的军事 ...
- 【数字识别】基于模板匹配实现OCR印刷字母+数字识别含Matlab源码
1 简介 OCR技术是光学字符识别的缩写, 是通过扫描等光学输入方式将各种票据.报刊.书籍.文稿及其它印刷品的文字转化为图像信息, 再利用文字识别技术将图像信息转化为可以使用的计算机输入技术.由于其应 ...
- 视觉里程计02 基于特征匹配的位姿估计
概述 特征点的投影模型为 \(p=\frac{1}{Z} KP\),\(P\)为世界坐标系下某点的坐标(\(Z\)为z方向的坐标),\(p\)为对应图像特征点.\(K\)为内参,在标定好的相机下,\( ...
- 干货 | 基于特征的图像配准用于缺陷检测
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 特征提取 基于特征的图像配准,具有非常广泛的应用,大致流程可以如下 ...
最新文章
- 58.最全正则表达式教程,最好正则表达式教程
- python 模块学习 hashlib
- [CF487E]Tourists
- R-FCN/Faster-rcnn使用snapshot继续训练
- REVERSE-PRACTICE-BUUCTF-9
- 32位和64位机器上C语言数据类型的大小
- 在 Ubuntu 14.04 中安装 Pepper Flash Player For Chromium-转
- python字符串不可改变怎么理解_python的“不可变性”代表了什么?
- 31. HTTP 与 HTTPS 区别
- WPF学习笔记(6):DataSet更新后台数据库个别列失败的问题
- Java视频教程免费分享(网盘直接取)
- 关键词堆砌生成器_网络推广软件的使用和24种关键词挖掘方法
- 三十、在实践中培养和选拔干部(第1版)
- 死链提交为什么不能提交 html文件,搜狗死链提交
- chm打开,显示“已取消到该网站的导航”
- 中职一年级计算机学情分析,一年级学生学情分析
- 服务器vga转hdmi显示器不亮,手把手教你排除HDMI转VGA常见故障
- 「积木库」来了,做网站像搭积木一样简单
- 基于Revit铝模板设计-区域配模
- 计算机基础知识(基础入门小白专属)六
热门文章
- Convex Optimization 凸优化学习 第三章 凸函数(一)
- 技术人员如何写好一封邮件
- 【软件工程】软件需求
- 《日语综合教程》第七册 第六課 自然と人間
- REINFORCE和A2C的异同
- 为什么我的同花顺选股服务器列表为空,同花顺选股公式,为什么我就选不出股票来呢数......
- 编写选股公式、同花顺选股公式编写、编写涨停三阴线超短选股指标公式、编写选股公式...
- 第一周作业(零基础)
- 解决 HDFS副本数不足问题
- 【电源专题】什么是开关稳压器