图片中文字切割
%% 程序说明
% 程序功能:将图片中每个字保存为图片
% 本程序由matlab语言编写,初衷是提取五笔字根图片中的字根,用于制作anki卡片。
% 因为有些字根无法由输入法直接输入,又不想截图,无奈出此下策直接全部提取。
% 提取之前首先去噪,然后根据要获取目标的像素尺寸,构建一个模版,本程序中构建
% 的是20×20像素的模版。用这个模版去识别目标,要求识别成功时,模版四条边均有
% 一像素宽的白边,且模版内有内容。
% 如需用本程序处理其他图片,识别其他元素,需重新设置模版尺寸。
% 如需使用本程序,将代码存为.m文件,和待处理图片放在同一文件夹内,程序运行结果
% 保存在本目录下wordPic_tmp文件夹中。
%% 源程序
clear;
clc;
mkdir('wordPic_tmp');
A=imread('1.png');
% 图像去噪
denoise(A);
% 单字获取
A=imread('A.png');
imageCut(A);
%% 图像分割
function imageCut(A)
B=rgb2gray(A);
[m,n]=size(B);
wordLen=20;
pics=1;
i=1;
j=1;
lastPics=1;
while(i<m-wordLen+1)
while(j<n-wordLen+1)
whiteLine=true;
for m_j=j:j+wordLen-1
if (B(i,m_j)~=255)
whiteLine=false;
break;
end
end
if (whiteLine)
pics=wordGet(B,i,j,pics);
if(pics~=lastPics)
j=j+wordLen/2;
lastPics=pics;
else
j=j+1;
end
continue;
else
j=j+1;
end
end
i=i+1;
j=1;
end
end
%% 提取中文单字
% whiteLine:当前线段(长度=模版长度)为白色线段
% whiteLines:白色线段条数
% wordExist:当前模版内存在内容,但不确定是不是完整的单字
function pics=wordGet(B,loc_row,loc_col,pics)
[m,n]=size(B);
wordLen=20;
wordExist=false;
whiteLines=0;
for j=loc_col:loc_col+wordLen-1
if(B(loc_row+1,j)~=255)
wordExist=true;
break;
end
end
if (wordExist)
for i=loc_row:m
whiteLine=true;%
% 控制模版左右白边
if((B(i,loc_col)~=255) || (B(i,loc_col+wordLen-1)~=255))
return
end
for j=loc_col:loc_col+wordLen-1
if (B(i,j)~=255)
whiteLine=false;
break;
end
end
if(whiteLine)
whiteLines=whiteLines+1;
end
% 控制上部白边为1,下部白边为2。为什么下部白边不设置为1呢?
% 主要是防止单字内部出现白边,如果设置为1可能将单字的一部分
% 识别出来。
if(whiteLines>2)
% 控制模版上下白边
for m_j=loc_col:loc_col+wordLen-1
if((B(loc_row,m_j)~=255) || (B(i,m_j)~=255))
return
end
end
imwrite(B(loc_row:i,loc_col:loc_col+wordLen-1),['.\wordPic_tmp\',num2str(pics),'.png']);
pics=pics+1;
return
end
if((i-loc_row)>wordLen)
return
end
end
else
return
end
end
%% 图像去噪
function denoise(A)
% 转灰度,便于处理
B=rgb2gray(A);
% m、n分别存储图片的长和宽
[m,n]=size(B);
% 噪声范围,这个噪声范围是根据图片中噪声情况定的
cl=200;
ch=254;
C=B; % 图片复制一份
% 只要图片C中还有需要处理的像素,就继续调用processing进行去噪,不断迭代
while(check(C,m,n,cl,ch))
C=processing(C,C,m,n,cl,ch);
end
imshow(C);
% 保存灰度图片为gray.png
imwrite(C,'gray.png');
% 根据灰度图片处理情况处理彩色图片
for i=1:m
for j=1:n
if(C(i,j)==255)
A(i,j,:)=[255 255 255];
end
end
end
% 保存彩色图片为A.png
imwrite(A,'A.png');
end
%% 去噪函数
function C=processing(B,C,m,n,cl,ch)
% 像素遍历
for i=1:m
for j=1:n
cope=true;%cope表示此像素是否可以处理,默认为可以
if (B(i,j)>=cl) && (B(i,j)<=ch && i>1 && i<m && j>1 && j<n)
%要求8邻域内没有属于文字的像素
for row=-1:1
for col=-1:1
if(B(i+row,j+col)<120)
cope=false;
break;
end
end
if (cope==false)
break;
end
end
if(cope)
C(i,j)=255;
end
end
end
end
end
%% 检测是否要进行下一代去噪
% 如果图片有需要处理的像素点,就返回true
function m_r=check(B,m,n,cl,ch)
for i=1:m
for j=1:n
m_r=false;
cope=true;%cope表示此像素是否可以处理,默认为可以
if (B(i,j)>=cl) && (B(i,j)<=ch && i>1 && i<m && j>1 && j<n)
%要求8邻域内没有属于文字的像素
for row=-1:1
for col=-1:1
if(B(i+row,j+col)<120)
cope=false;
break;
end
end
if (cope==false)
break;
end
end
if(cope)
m_r=true;
return
end
end
end
end
end
被处理图片

运行结果展示


浙公网安备 33010602011771号