グラフが入った画像ファイルがあります。例えば:
このグラフを効率的に抽出するにはどうすればよいですか?いくつかの例/概念を教えていただけますか?
エッジの詳細を含むデータファイルがあり、それらをマップにプロットして、背景が異なる画像(リンクに示されているような)を作成できます。2つを比較して、一致/不一致があると言うにはどうすればよいですか?
ヘルプ/コメント/考えは大歓迎です。
グラフが入った画像ファイルがあります。例えば:
このグラフを効率的に抽出するにはどうすればよいですか?いくつかの例/概念を教えていただけますか?
エッジの詳細を含むデータファイルがあり、それらをマップにプロットして、背景が異なる画像(リンクに示されているような)を作成できます。2つを比較して、一致/不一致があると言うにはどうすればよいですか?
ヘルプ/コメント/考えは大歓迎です。
これを別のイメージで再現することはほとんどできないため、これはこの特定のイメージで機能するものの概要にすぎません。
最初に画像を CMYK に変換し、3 番目のチャネル (「Y」) を 2 値化 (最大の 80%、頂点は相対的に黄色) して頂点を見つけます。
次に、エッジを見つけるために 2 番目のチャネル ('M') を 2 値化 (再び最大値の 80%) することを検討します。
各頂点を連結成分と見なし、各エッジも連結成分と見なすと、両方の画像を同時に考慮し、特定の頂点がどのエッジに接しているかを考慮するだけでグラフを作成できます。
テキストを見つけるために、入力画像をグレースケールに変換できるようになりました。この単純な画像では、アドホックな連結成分分析と単純なしきい値により、すべてのテキストが得られます。
この最後の画像に対してかなり基本的なテキスト認識を実行すると、次のようになります。
Seattle
Chicago
Bay Area DC Metro NYC
Denver
Los
Angeles
Phoenix
すべてのテキストが見つかったので、これはかなり良いことです。あとは、作成済みのグラフの頂点に名前を付けるだけです。これを行うには、テキストのブロックが表示される場所を検討し、最も近いエッジを見つけます (最初の画像、重心までのユークリッド距離)。
重要な場合は、これらの結果を取得するためのコードを次に示します。
f = Import["http://i.stack.imgur.com/DP3la.png"]
cmyk = ColorSeparate[f, "CMYK"]
vertex = Binarize[cmyk[[3]], 0.8] (* The first image *)
edge = Binarize[cmyk[[2]], 0.8] (* The second image *)
nyctext = SelectComponents[
DeleteSmallComponents[
SelectComponents[Binarize[ColorConvert[f, "Grayscale"], 0.01],
Small]], "Length", #1 < 25 &]
alltext = ImageAdd[
SelectComponents[
ColorNegate[Binarize[ColorConvert[f, "Grayscale"], 0.5]], Small],
nyc_text] (* The last image *)
TextRecognize[alltext] (* The text recognized *)