图片中文字切割
%% 程序说明 % 程序功能:将图片中每个字保存为图片 % 本程序由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
被处理图片
运行结果展示