真面目な方法ではありませんが,文字を知りたいのではなくて場所を知りたいだけであれば,
文字の部分 → 黒がごちゃごちゃしているところ
と考えて
- 2値化
- 黒が広がって文字の中空が埋まる程度にerode
- 線が消えることを期待して,2.よりもやや強めにdilate
とかすれば,ある程度の精度で,文字が存在した箇所だけが黒になるようなマスクが得られるでしょう.
例えば,こんな処理で…
C++
1//グレースケールで画像を読込んで2値化
2cv::Mat Src = cv::imread( "paper.png", cv::IMREAD_GRAYSCALE );
3cv::threshold( Src,Src, 128+64, 255, cv::THRESH_BINARY );
4cv::imshow( "Src", Src );
5//モルフォロジ
6const int iter = 4;
7cv::Mat mask;
8cv::erode( Src,mask, cv::Mat(), cv::Point(-1,-1), iter );
9cv::dilate( mask,mask, cv::Mat(), cv::Point(-1,-1), iter+2 );
10cv::imshow( "mask", mask );
こんなマスク画像が得られます.
この結果を,元画像の枠(contourとかで別途検出しておく)毎にグループ化する等すればどうでしょうか.
(その過程で,マスクに残っていた枠線も棄却できそうに思います)