手書き認識プロジェクトを開発しています。このプロジェクトの要件の1つは、画像入力を取得することです。この画像には、ランダムな場所にある文字オブジェクトのみが含まれています。最初に、この文字を抽出して次のステップで処理する必要があります。
今、私はそのような難しい問題を混乱させています:黒/白(バイナリ)画像から1つの文字を抽出する方法、または黒-白(バイナリ)画像で文字のバインドされた長方形を描画する方法?
どうもありがとう!
手書き認識プロジェクトを開発しています。このプロジェクトの要件の1つは、画像入力を取得することです。この画像には、ランダムな場所にある文字オブジェクトのみが含まれています。最初に、この文字を抽出して次のステップで処理する必要があります。
今、私はそのような難しい問題を混乱させています:黒/白(バイナリ)画像から1つの文字を抽出する方法、または黒-白(バイナリ)画像で文字のバインドされた長方形を描画する方法?
どうもありがとう!
MATLABを使用している場合(このようなタスクには最適なので、ぜひ使用してください)、組み込み関数bwlabel()とregionprops()を調べることをお勧めします。これらは、すべての文字をセグメント化し、それらのバウンディングボックス情報を取得するのに十分なはずです。
いくつかのサンプルコードを以下に示します。
%Read image
Im = imread('im1.jpg');
%Make binary
Im(Im < 128) = 1;
Im(Im >= 128) = 0;
%Segment out all connected regions
ImL = bwlabel(Im);
%Get labels for all distinct regions
labels = unique(ImL);
%Remove label 0, corresponding to background
labels(labels==0) = [];
%Get bounding box for each segmentation
Character = struct('BoundingBox',zeros(1,4));
nrValidDetections = 0;
for i=1:length(labels)
D = regionprops(ImL==labels(i));
if D.Area > 10
nrValidDetections = nrValidDetections + 1;
Character(nrValidDetections).BoundingBox = D.BoundingBox;
end
end
%Visualize results
figure(1);
imagesc(ImL);
xlim([0 200]);
for i=1:nrValidDetections
rectangle('Position',[Character(i).BoundingBox(1) ...
Character(i).BoundingBox(2) ...
Character(i).BoundingBox(3) ...
Character(i).BoundingBox(4)]);
end
ここで読み込んだ画像は0〜255なので、バイナリにするためにしきい値を設定する必要があります。iとjの上のドットが問題になる可能性があるため、個別の領域を構成するピクセル数にもしきい値を設定します。
結果はここで見ることができます: https ://www.sugarsync.com/pf/D775999_6750989_128710
私の場合、文字を抽出するためのより良い方法は、いくつかの論文しか共有できないヒストグラムのセグメンテーションでした。
これはあなたを助けることができるかもしれません
簡単なオプションの1つは、次のような全数検索を使用することです(テキストが黒で、背景が白であると想定)。
left
。right
。top
。あなたのキャラクターは、(left - 1, top - 1)
左上隅と(right, bottom)
右下隅として定義されたボックス内に含まれます。