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

基于特征匹配的英文印刷字符识别代码自己的注释相关推荐

  1. 第 09 章 基于特征匹配的英文印刷字符识别 MATLAB深度学习实战案例

    基于特征匹配的英文印刷字符识别 MATLAB深度学习实战 话不多讲,直接开撸代码 MainForm函数 function MainForm global bw; global bl; global b ...

  2. 【MATLAB图像处理实用案例详解(6)】—— 基于特征匹配的英文印刷字符识别

    目录 一.背景意义 二.理论基础 2.1 图像预处理 2.2 图像识别技术 2.2.1 统计特征字符识别技术 2.2.2 结构特征字符识别技术 2.2.3 基于机器学习的识别技术 三.效果演示 一.背 ...

  3. 【印刷字符识别】基于matlab特征匹配英文印刷字符识别【含Matlab源码 310期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源: [印刷字符识别]基于matlab特征匹配英文印刷字符识别[含Matlab源码 310期] 获取代码方式2: 通过订阅紫极神光博客付费专栏 ...

  4. 视频+课件| PointDSC:基于特征匹配的点云配准方法(CVPR2021)

    写在前面 感谢「3D视觉从入门到精通」知识星球嘉宾白旭阳博士为我们带来的主题为PointDSC:基于特征匹配的点云配准方法(CVPR2021)视频讲解,星球成员可免费观看学习.备注:白旭阳,香港科技大 ...

  5. 重磅直播 | PointDSC:基于特征匹配的点云配准方法(CVPR2021)

    大家好,本公众号现已开启线上视频公开课,主讲人通过B站直播间,对3D视觉领域相关知识点进行讲解,并在微信群内完成答疑. 本期由香港科技大学计算机系白旭阳博士分享,分享的主题为<基于特征匹配的鲁棒 ...

  6. 水声信号混响matlab,基于特征匹配的复杂水声信号仿真模型验证方法

    0引言由于实测目标回波.辐射噪声.海洋混响非常困难,在实验室重构这些复杂水声信号有着重要的意义.例如,在声自导鱼雷半实物仿真实验中,常采用目标回波.辐射噪声的仿真信号替代实测信号,由此产生了极大的军事 ...

  7. 【数字识别】基于模板匹配实现OCR印刷字母+数字识别含Matlab源码

    1 简介 OCR技术是光学字符识别的缩写, 是通过扫描等光学输入方式将各种票据.报刊.书籍.文稿及其它印刷品的文字转化为图像信息, 再利用文字识别技术将图像信息转化为可以使用的计算机输入技术.由于其应 ...

  8. 视觉里程计02 基于特征匹配的位姿估计

    概述 特征点的投影模型为 \(p=\frac{1}{Z} KP\),\(P\)为世界坐标系下某点的坐标(\(Z\)为z方向的坐标),\(p\)为对应图像特征点.\(K\)为内参,在标定好的相机下,\( ...

  9. 干货 | 基于特征的图像配准用于缺陷检测

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 特征提取 基于特征的图像配准,具有非常广泛的应用,大致流程可以如下 ...

最新文章

  1. 58.最全正则表达式教程,最好正则表达式教程
  2. python 模块学习 hashlib
  3. [CF487E]Tourists
  4. R-FCN/Faster-rcnn使用snapshot继续训练
  5. REVERSE-PRACTICE-BUUCTF-9
  6. 32位和64位机器上C语言数据类型的大小
  7. 在 Ubuntu 14.04 中安装 Pepper Flash Player For Chromium-转
  8. python字符串不可改变怎么理解_python的“不可变性”代表了什么?
  9. 31. HTTP 与 HTTPS 区别
  10. WPF学习笔记(6):DataSet更新后台数据库个别列失败的问题
  11. Java视频教程免费分享(网盘直接取)
  12. 关键词堆砌生成器_网络推广软件的使用和24种关键词挖掘方法
  13. 三十、在实践中培养和选拔干部(第1版)
  14. 死链提交为什么不能提交 html文件,搜狗死链提交
  15. chm打开,显示“已取消到该网站的导航”
  16. 中职一年级计算机学情分析,一年级学生学情分析
  17. 服务器vga转hdmi显示器不亮,手把手教你排除HDMI转VGA常见故障
  18. 「积木库」来了,做网站像搭积木一样简单
  19. 基于Revit铝模板设计-区域配模
  20. 计算机基础知识(基础入门小白专属)六

热门文章

  1. Convex Optimization 凸优化学习 第三章 凸函数(一)
  2. 技术人员如何写好一封邮件
  3. 【软件工程】软件需求
  4. 《日语综合教程》第七册 第六課 自然と人間
  5. REINFORCE和A2C的异同
  6. 为什么我的同花顺选股服务器列表为空,同花顺选股公式,为什么我就选不出股票来呢数......
  7. 编写选股公式、同花顺选股公式编写、编写涨停三阴线超短选股指标公式、编写选股公式...
  8. 第一周作业(零基础)
  9. 解决 HDFS副本数不足问题
  10. 【电源专题】什么是开关稳压器