图片中文字切割

%% 程序说明
% 程序功能:将图片中每个字保存为图片
% 本程序由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

 

被处理图片

 

 

运行结果展示

 

posted @ 2019-08-26 09:23  谷谷非鼠  阅读(310)  评论(0编辑  收藏  举报