3

(科学的な)プロットや図の画像を強調するためのライブラリルーチンを探しています。典型的な例を

http://www.jcheminf.com/content/pdf/1758-2946-4-11.pdf

およびhttp://en.wikipedia.org/wiki/Anti-aliasingの図3

これらには、次の機能があります。

  • それらは通常、非常に少数のプリミティブ(線、文字、円、長方形)を使用します
  • それらは通常モノクロ(黒/白)であるか、ブロックカラーの数が非常に少ないです
  • オリジナルにはグラデーションやパターンはありません。

プリミティブを再構築したいと思います。次の分析段階(線検出とOCRを含む場合があります)の前に、画像内のきれいな線を復元するアルゴリズムを探しています。ノイズはしばしば発生します:

  • JPGの使用(ノイズは元のプリミティブの近くでよく見られます)
  • アンチエイリアシング

私は無料/オープンソースソリューションを必要としており、理想的には既存のJavaライブラリが欲しいです。すでにいくつかの仕事をしている、またはラインを再構築しているものがあれば、それはボーナスになります!文字認識については、この段階で各文字を分離し、OCRを延期したいと思いますが、それへのポインタもありがたいです。

更新:賞金があっても、質問に対する実質的な回答がなかったことに驚いています。したがって、私はそれを自分で調査しています。私はまだ答えを招待しますが、彼らは私自身の答えを超えるべきです。

4

3 に答える 3

4

自身の質問への回答 ほぼ 1 週間経っても回答が得られなかったので、私が今計画していることは次のとおりです。

別のSO投稿でキャニーエッジ検出アルゴリズムについての言及を見つけた後、次のことを見つけました。

[http://www.tomgibara.com/computer-vision/canny-edge-detector][2]

トム・ギバラより。

これはデフォルト モードで非常に使いやすく、メイン プログラムは次のとおりです。

    public static void main(String[] args) throws Exception {
             File file = new File("c.bmp");
     //create the detector
     CannyEdgeDetector detector = new CannyEdgeDetector();
     //adjust its parameters as desired
     detector.setLowThreshold(0.5f);
     detector.setHighThreshold(1f);
     //apply it to an image
     BufferedImage img = ImageIO.read(file);
     detector.setSourceImage(img);
     detector.process();
     BufferedImage edges = detector.getEdgesImage();
     ImageIO.write(edges, "png", new File("c.png"));
}

ここで、ImageIO はビットマップの読み取りと書き込みを行います。未処理の画像は 24 ビットの BMP として読み込まれます (ImageIO は色範囲が低いと失敗するようです)。デフォルトは Gibara のすぐに使える状態です。

エッジ検出は非常に印象的で、すべての線と文字の輪郭を描きます。このビットマップ

生のビットマップ

エッジに変換されます

エッジが検出されました

だから今私は2つのタスクがあります:

  • 本質的にきれいな「トラムライン」であるアウトラインに直線を当てはめます。これは、きれいな図では簡単だと思います。ライン プリミティブをアウトラインに適合させるための Java ライブラリについて言及していただければ幸いです。
  • 文字を認識します。Gibara はそれらを分離する優れた仕事をしたので、これは個々のグリフを認識する演習です。アウトラインを使用して各グリフの個々のピクセル マップを分離し、これらをJavaOCRに渡すことができます。または、輪郭だけで文字を直接認識できる場合もあります。フォントが何かはわかりませんが、ほとんどの文字は 32 ~ 255 の範囲にあり、ヒューリスティック マップを作成できると思います。

Java で BufferedImage を適切にロードするにはどうすればよいですか? を参照してください。Java でビットマップをロードするため

于 2012-07-08T07:51:13.260 に答える
1

プリミティブを再構築したいと思います。次の分析段階(線検出とOCRを含む場合があります)の前に、画像内のきれいな線を復元するアルゴリズムを探しています。

jaitoolsを見たことがありますか?(http://code.google.com/p/jaitools/)。

グラフィックをベクトル化するためのAPIがあり、非常に高速で柔軟性があります。こちらのAPIとドキュメントをご覧ください:http://jaitools.org/

于 2012-07-10T15:21:10.340 に答える
1

Java ライブラリ

OpenCV は、このようなコンピューター ビジョン タスクの頼りになるライブラリです。ここに Java バインディングがあります: http://code.google.com/p/javacv/。OpenCV は、基本的な画像処理フィルターから高レベルのオブジェクトおよびモーション検出アルゴリズムまで、すべてをカバーしています。

ライン検出

直線を検出するには、ハフ変換を試してください。OpenCV チュートリアルには良い説明があります: http://opencv.itseez.com/doc/tutorials/imgproc/imgtrans/hough_lines/hough_lines.html#how-does-it-work

従来のハフ変換は無限の線を出力しますが、OpenCV は、線分を出力する確率論的ハフ変換と呼ばれるバリアントも実装しています。それはあなたが必要とするものを与えるべきです。オリジナルの学術論文はこちら: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.34.9440&rep=rep1&type=pdf

線分を検出したら、リンクされた線分を検出してそれらを結合したい場合があります。単純な画像の場合、すべてのセグメント エンドポイントを力ずくで比較することで、おそらくうまくいくでしょう。小さな半径 (たとえば 2 ピクセル) 内に複数のエンドポイントが検出された場合は、それらを結合して線が連続していることを確認します。結合された線分の間の角度を測定して、多角形を検出することもできます。

サークル検出

ここで説明されている、円を検出できる別のバージョンのハフ変換があります

于 2012-07-11T03:22:03.833 に答える