グラフの画像から数値を読み取る

 論文に限った話ではないのだけど、ネットで拾ったり書籍からスキャンしたりしたグラフがあってデータを解析したいときに、このグラフのデータがあれば凄く便利なのに、と思うときが多々ある。
 プログラムが得意な人なら自分でプログラムを組んでしまうのでしょう。昔は研究者ならプログラムくらいできて当たり前だったけど、今どきはそんなことない。一方、昔はスキャナとかデジカメとかはあんまりなくて、画像処理さえ覚束ない感じだったので、あんまりそういう需要はなかったのかも知れない。もしかしたら、グラフ用紙にコピーして手動でデータを作っていたかも知れない。
 それはそうと、プログラムが得意な研究者が絶滅したわけではなく、そういう人が作ったと思われるプログラムが世の中にある。
 今回紹介するのは、そんな感じでグラフの画像からデータを読み出してくれるDigitalCurveTracerというソフトである。
 どういう背景で作ったのか知らないが、ちょっとプログラムの得意な研究者が上記のような理由で欲しくなったので作ったのだと思う。これ以外にもグラフを数値化してくれるフリーソフトはあるみたいだけど、検索して出てきたのでこれを使ってみた。
 単機能で習熟の必要のない分かりやすいソフトである。
 読み取ってみるデータはテキトーに見つけてきたCCDの波長感度分布のグラフ(魚拓)。RGBの3色あるのでテストするにしては複雑である。

 元のページにはCCD,CMOSの量子効率・波長特性となっているが、実際はセンサーの前に付けられているカラーフィルターの透過光の波長分布だと思われる。だって、CCDもCMOSもおんなじ形してるんだもん。
 ダウンロード、インストールしてソフトを立ち上げると読み込む画像を要求してくる。ここで上のファイルを読み込むと、次のような表示になる。

 データを引っ張り出す作業としては、座標軸を特定して読み取り開始位置と終了位置を指定するという単純なものである。
 次のような手順で行う。

 まず、座標軸を設定するので、2点指定してこの点を縦横の大きさなどの基準とする。
①縦横の青い直線が交わっている点を1つ目の基準点とする。場所は座標が分かればどこでも良いが、2点ができるだけ離れている方が誤差は少なくなるはずである。この場合だと、グラフの左下(350, 0.1)でよい。
②同じく②点目を指定する。例えば右上の(1100, 0.6)あたりでどうだろうか。
⑤番号が飛んだけど、2点を指定したので、この2点の座標を入力する。なお、通常の座標系と対数を選ぶことができる。
 これで、グラフの座標系を作ることができた。
③グラフのスタート地点を設定する。グラフは左から右へと読むようになっているので、グラフの左端を指定する。
④グラフのゴール地点を設定する。なお、指定するライン自体は③で指定しているので、ここでは終了のX座標が分かればよいので縦線で示されている。
⑥このボタンを押すと解析が始まる。なお、この例でやろうとしてもできない。カラーのグラフには対応していないのだと思う。後で説明する。
⑦読み出したグラフのデータをテキストデータで出力するボタン。

 使い方はこんな感じで他にも何個かボタンがあるが、使わない。画像に手を加える機能であるが、画像処理能力が低すぎて使いものにならないからである。
 さて、⑥に書いたように3色のカラーグラフは読んでもらえない。だから、画像処理によって3つのグラフに分けて処理しなければならない。
 画像処理と書くと難しく感じるけど、必要のないグラフを消してモノクロ画像に変えるだけである。面倒だけど、難しいことはない。

 例えばこれは赤のグラフを取り出したもの。これで十分である。
 注意するポイントとしては、罫線もグラフとして読み間違えてくれるという点である。従ってグラフに接触している罫線は消さなければならない。ただし、グラフの読み方として左から右に順に読んでいくので、左側に接している罫線は消す必要はない。同じく、別のグラフも左側で接しているものは消す必要はない。右側と上下で接しているものはきっちり消さなければならない。
 面倒だけど、これだけでよい。テキトーな画像処理ソフトでこういった下準備をしてからDigitalCurveTracerにグラフを読ませてやれば良い。あとは上の手順通り座標を指定してボタンを押していけば完成する。
 ただし、読み込んだ値が間違っているということがよくあるので、ちゃんとエクセルとかKaleidaGraphとかで描いてやってちゃんとあっているか確認すること。
 今回、試しにグラフを作ったところ、X座標が270とかから始まることがあったので間違いが多いことが予想される。このあたりは、まともな開発商品ではなく、特に難しいことを考えずに個人で作ったものだから仕方がないと思う。だいぶ前に僕が作ったGaussianの出力をChem3Dで読み込むCC1ファイルに変換するプログラムみたいなものだと考えている。

 最終的に得られたグラフは下のようになった。

 全く問題のない出来である。