Masassiah Blog

現役サラリーマンのスキルアップのための読書まとめ

文字抽出

イメージ 1

MATLABを使って文字抽出を行ってみました。文字抽出というより、文字とその他の部分で画像を2値化するプログラムです。
以前のボリュームデータの可視化で使ったisosurfaceを使って実現しました。isosurfaceは3次元でしか使えない(?)ので画像データ(もちろん2次元)を3次元に変更してからisosurfaceを使っています。このプロセスは非常に無駄であることは百も承知ですが、isosurfaceのような2次元でも使える関数を自作するのは面倒ということで。。。
まあこのプログラムはthという変数で定義しているisosurfaceの閾値は、画像によって違ってくるだろうけれど、とりあえず今回の画像(左側の黒板に書いた「丁」という文字)でうまくいった値を入れておきました。また「田」とか「日」とか「口」とかみたいな閉じた形の文字(?)ではうまく文字抽出を行えないのであしからず。

MATLABプログラム
clear all;
close all;
th=70;
A=imread('pic1.bmp');
%===RGB2GRAY===%
B=0.299*A(:,:,1)+0.587*A(:,:,2)+0.144*A(:,:,3);
C=zeros(size(A));
for m1=1:3;C(:,:,m1)=B;end;
C=smooth3(C);
[F,V]=isosurface(C,th);
D=zeros(size(B));
for m1=1:length(V);
    if V(m1,3)==2;
        D(floor(V(m1,2)),floor(V(m1,1)))=1;
    end
end
[xmax,ymax]=size(B);
D(1,:)=1;D(xmax,:)=1;
D(:,1)=1;D(:,ymax)=1;
x0=10;y0=10;
xy=[x0,y0];
xytmp=xy;
%===Baketsu tool===%
while 1
    m=1;
    for n=1:length(xy(:,1))
        x=xy(n,1); y=xy(n,2);
        D(x,y)=1;
        if D(x+1,y)==0
            D(x+1,y)=1;xytmp(m,1:2)=[x+1,y];m=m+1;
        end
        if D(x-1,y)==0
            D(x-1,y)=1;xytmp(m,1:2)=[x-1,y];m=m+1;
        end
        if D(x,y+1)==0
            D(x,y+1)=1;xytmp(m,1:2)=[x,y+1];m=m+1;
        end
        if D(x,y-1)==0
            D(x,y-1)=1;xytmp(m,1:2)=[x,y-1];m=m+1;
        end
    end
    xy=xytmp;
    if m==1
        break
    end
end
subplot(1,2,1);image(A);axis('equal');axis([1,xmax,1,ymax]);
subplot(1,2,2);imagesc(D);axis('equal');axis([1,xmax,1,ymax]);