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