毕业设计 图像识别文字区域提取算法研究与实现
算法 实现 研究 文字 提取 区域 毕业设计 图像识别
2023-09-11 14:19:18 时间
0 项目说明
图像中文字区域提取研究
提示:适合用于课程设计或毕业设计,工作量达标,源码开放
1 使用说明
- 基于swt和mser算法的文本检测,用到了SVM分类器
- 只限于检测字体较为规范的英文文本
- 使用时,先运行mser_swt.m文件,再运行detection_Eng.m文件
2 算法流程
3 部分实验效果
4 项目源码
%函数功能:计算输入图像的笔画宽度图像
%包含两次计算,第二次为笔画拐角处的计算值的修正
function [swtmap2]=SwtTransform(str,searchDirection)
im=imread(str);
if size(im,3)==3
im=rgb2gray(im);
end
im=im2double((im));
%figure,imshow(im);
edgeMap=edge(im,'canny');
%figure,imshow(edgeMap,[]);
sobelMask = fspecial('sobel');
dx = imfilter(im,sobelMask);
dy = imfilter(im,sobelMask');
[edgePointRows, edgePointCols] = find(edgeMap);
%初始化梯度角度矩阵
theta=zeros(size(edgeMap,1),size(edgeMap,2));
%计算边缘图像中每个像素的梯度方向
for i=1:size(edgeMap,1)
for j=1:size(edgeMap,2)
if edgeMap(i,j)==1
theta(i,j)=atan2(dy(i,j),dx(i,j));
end
end
end
[m,n] = size(edgeMap);
% 初始化笔画宽度
swtMap = zeros(m,n);
for i=1:m
for j=1:n
swtMap(i,j) =1000;
end
end
% 笔划宽度最大值
maxStrokeWidth = 350;
% 初始化矩阵储存所有可能的笔画点
strokePointsX = zeros(size(edgePointCols));
strokePointsY = zeros(size(strokePointsX));
sizeOfStrokePoints = 0;
widthvalue=zeros(1,10000);
widthvalue(1)=inf;
% Iterate through all edge points and compute stoke widths
for i=1:size(edgePointRows)
step = 1;
initialX = edgePointRows(i);
initialY = edgePointCols(i);
isStroke = 0;
initialTheta = theta(initialX,initialY);
sizeOfRay = 0;
pointOfRayX = zeros(maxStrokeWidth,1);
pointOfRayY = zeros(maxStrokeWidth,1);
% 记录射线的第一个点
pointOfRayX(sizeOfRay+1) = initialX;
pointOfRayY(sizeOfRay+1) = initialY;
% 增加射线长度
sizeOfRay = sizeOfRay + 1;
while step < maxStrokeWidth
nextX = round(initialX + cos(initialTheta) * searchDirection * step);
nextY = round(initialY + sin(initialTheta) * searchDirection * step);
step = step + 1;
if nextX < 1 || nextY < 1 || nextX > m || nextY > n
break
end
% 记录射线的下一个点
pointOfRayX(sizeOfRay+1) = nextX;
pointOfRayY(sizeOfRay+1) = nextY;
%增加射线长度
sizeOfRay = sizeOfRay + 1;
% 找到对应的边缘像素点
if edgeMap(nextX,nextY)
oppositeTheta = theta(nextX,nextY);
% 判断梯度方向角度
if abs(abs(initialTheta - oppositeTheta) - pi) < pi/2
isStroke = 1;
strokePointsX(sizeOfStrokePoints+1) = initialX;
strokePointsY(sizeOfStrokePoints+1) = initialY;
sizeOfStrokePoints = sizeOfStrokePoints + 1;
end
break
end
end
if isStroke
% 计算笔划宽度
strokeWidth = sqrt((nextX - initialX)^2 + (nextY - initialY)^2);
widthvalue(i)=strokeWidth;
% Iterate all ray points and populate with the minimum stroke width
for j=1:sizeOfRay
swtMap(pointOfRayX(j),pointOfRayY(j)) = min(swtMap(pointOfRayX(j),pointOfRayY(j)),strokeWidth);
end
end
end
a=max(widthvalue,[],2);
[a,b]=size(swtMap);
for i=1:m
for j=1:n
if swtMap(i,j)>=0.1*a
swtMap(i,j)=1000;
end
end
end
for i=1:sizeOfStrokePoints
step = 1;
initialX = strokePointsX(i);
initialY = strokePointsY(i);
initialTheta = theta(initialX,initialY);
sizeOfRay = 0;
pointOfRayX = zeros(maxStrokeWidth,1);
pointOfRayY = zeros(maxStrokeWidth,1);
swtValues = zeros(maxStrokeWidth,1);
sizeOfSWTValues = 0;
% 记录射线第一个点
pointOfRayX(sizeOfRay+1) = initialX;
pointOfRayY(sizeOfRay+1) = initialY;
% 增加射线长度
sizeOfRay = sizeOfRay + 1;
% Record the swt value of first stoke point
swtValues(sizeOfSWTValues+1) = swtMap(initialX,initialY);
sizeOfSWTValues = sizeOfSWTValues + 1;
while step < maxStrokeWidth
nextX = round(initialX + cos(initialTheta) * searchDirection * step);
nextY = round(initialY + sin(initialTheta) * searchDirection * step);
step = step + 1;
% 记录射线的下一个点
pointOfRayX(sizeOfRay+1) = nextX;
pointOfRayY(sizeOfRay+1) = nextY;
% 增加射线长度
sizeOfRay = sizeOfRay + 1;
% Record the swt value of next stoke point
swtValues(sizeOfSWTValues+1) = swtMap(nextX,nextY);
sizeOfSWTValues = sizeOfSWTValues + 1;
%找到对应的像素点
if edgeMap(nextX,nextY)
break
end
end
% 计算笔画宽度中值
strokeWidth = median(swtValues(1:sizeOfSWTValues));
% 取最小值
for j=1:sizeOfRay
swtMap(pointOfRayX(j),pointOfRayY(j)) = min(swtMap(pointOfRayX(j),pointOfRayY(j)),strokeWidth);
end
end
se=strel('square',2);
swtmap=imopen(swtMap,se);
swtmap2=imclose(swtmap,se);
figure,imshow(swtmap2,[]);
swtmap2=swtmap2/1000;
5 最后
相关文章
- Java实现 蓝桥杯 算法提高 高精度减法(JDK方法)
- Java实现 蓝桥杯VIP 算法提高 计算时间
- Java实现 蓝桥杯VIP 算法提高 能量项链
- Java实现 蓝桥杯VIP 算法提高 P0404
- Java实现 蓝桥杯 算法训练 p1103
- Java实现 蓝桥杯 算法训练 字串统计
- Java实现 蓝桥杯 算法训练 删除数组零元素
- Algorithm:C++语言实现之动态规划算法相关(矩阵连乘状态转移方程、字符串的交替连接、分析格网棋盘的特点、最短路线问题、生产计划问题、动态规划解下列非线性规划)
- ML之mlxtend:基于iris鸢尾花数据集利用逻辑回归LoR/随机森林RF/支持向量机SVM/集成学习算法结合mlxtend库实现模型可解释性
- 【故障定位】基于粒子群优化算法的故障定位及故障区段研究【IEEE33节点】(Matlab代码实现)
- 【无人机】基于灰狼优化算法的无人机路径规划问题研究(Matlab代码实现)
- 多因素蚁群算法的移动机器人路径规划研究(Matlab代码实现)
- 【回归预测-BP预测】基于思维进化算法优化BP神经网络在非线性函数拟合中的应用(Matlab代码实现)
- 【设备布局】基于粒子群优化算法的设备布局设计研究(Matlab代码实现)
- 基于免疫优化算法的物流配送中心选址规划研究(Matlab实现)
- 基于小波变换的图像边缘检测算法的研究(Matlab代码实现)
- 【编程实践】使用golang 解析json字符串代码 / 使用 golang 实现一个HashSet / 使用C语言实现KMP算法,并加上非常详尽的注释。
- Python:SMOTE算法——样本不均衡时候生成新样本的算法
- 【PMU】基于两种模拟退火方法、两种图论过程和递归安全N算法六种算法的最优PMU布置(OPP)研究(Matlab代码实现)
- 一种面向多通道系统的滤波x仿射投影符号算法(Matlab代码实现)
- 语音处理的算法和方法研究(Matlab代码实现)
- 【语音识别】基于LMS算法消除嘈杂的鸟类语音信号中的噪声后识别其对应的鸟类物种(Matlab代码实现)