DigitalMicrographのPythonを使用した拡張性を有するリアルタイムデータ処理

近年の電子顕微鏡を用いた観察はデータ集約型となって来ています。ほんの10年前と比較してデジタルカメラやその他の検出器は、遥かに動作が高速化し同時に大型化しました。結果として連続したデータ取得を伴うその場観察ではデータサイズが非常に大きくなっています。その場観察においては、電子顕微鏡内で観察された変化に基づいて次の実験条件を決定することがしばしば求められます。しかしながら、このような変化はリアルタイムで表示されるデフォルトのライブ像からは必ずしも明らかにはなりません。大容量のデータに対して、試料中に起こった変化を理解するために様々な方法で、かつリアルタイムでデータを処理し可視化を行うための方法を持つことは非常に有効です。これによって得られた情報に基づいた決定が実現されます。

これまで何年にも渡って、Gatanではスクリプト言語を用いたライブデータ処理と共にフル解像度とビット諧調を有する実データ(ストレージに書き込むよりも低いフレームレートの場合もありますが)をユーザーが利用可能とする“ライブビュー”ウインドウをサポートしてきました。この度GatanではDigitalMicrograph®へのPythonインテグレーションの提供を開始しました。このライブ処理機能はPython言語が多くの人に知られていることから研究者にとってより利用しやすくなっています。DigitalMicrographでPythonを初めて利用したい方のための多くの情報は、 Python in DigitalMicrograph ページを参照ください。

利用するためのハードルを下げるため、DigitalMicrographにおけるデジタルカメラから得られたライブビューのPythonを用いた処理のデモンストレーション用のスクリプト例をいくつか作成しました。これらの全てのスクリプトは Gatan Python scripts library、こちらから、あるいは本ページ以下の個々のリンクからアクセス可能です。DigitalMicrographのフリー版のIn-Situ Playerを使用することでライブビューと同様に取得済みのデータを表示させることも可能であり、これらのスクリプトはIn-Situ Playerのデータでも動作します。

各スクリプトはユーザーが指定したライブビュー上の関心領域(ROI)からデータを抽出し、NumPy配列を生成し多くのデータ処理のためのPythonのパッケージを用いて簡単に取り扱うことが可能です。このNumPy配列に対して処理が行われ、結果はDigitalMicrograph上の新しいイメージウインドウに表示されます。ライブビューが更新された際には、新しいデータが取得、処理され結果がアップデートされます。もし処理に時間を要する場合には、ライブビューもそれに応じて速度を低下させます。このスクリプトはソースコードが利用可能なため、NumPy配列への処理関数を所望のものに変更することも簡単です。もちろんそれ以外のDigitalMicrographに関わるスクリプトの機構は変更せずそのままになっています。これらのスクリプト例が現在のままでもユーザーにとって有効であることを期待していますが、これらの第一の目的は、スクリプトの第一歩として使用頂き、さらに皆さんの目的応じてさらにカスタマイズして頂くことにあります。

ガウシアンぼかし、またはメディアンフィルタを用いたライブビューデータのノイズ低減スクリプト の結果を図1Aに示します。個々の画像にこのような処理を適用することは、DigitalMicrographの標準のインターフェースからも可能です。しかしながら、スクリプトを使用すること無しにライブビューにリアルタイムで適用することは出来ません。PythonのパッケージであるSciPyにはこれらのフィルタ類が備えられているため、データにこれらのフィルタのひとつを適用するのに必要なのはただ1行のコードです。このスクリプトの出力結果はユーザーによって定義されたROIのサイズの新しい像であり、ライブビューもアップデートされます。もしスクリプト実行前にライブビュー上にROIを配置していない場合には、ROIは像全体を囲むように配置されます。

最も簡単なスクリプト はテンプレートだけであり、それ以外の処理は全く行っていません。ここでは単にデータを新しいウインドウへと都度コピーし、ライブビュー上のデータを更新しています。このスクリプトのコードと ノイズ低減スクリプト のコードを比較することで。どの部分が常に必要で、どの部分が全く異なる方法で処理するために変更出来るのかをよりはっきりさせることが出来ます。

次に示す ライブ信号差表示スクリプト では、図1Bに示すように、時間の経過と共に起こる信号強度の変化を見つけやすくなります。現在のフレームからひとつ前のフレームを単純に減算するだけでは非常にノイズの多い結果となってしまいます。それに代わって、ふたつの指数的に重み付けを行った移動平均を(異なる二つの時定数で)計算し、それらの差の絶対値を返します。ここまでの単純なコピーやノイズ低減スクリプトのように、出力はユーザーが指定したROIの寸法の像として更新されます。もし試料がドリフトしている場合には(その場観察では多くの場合ドリフトします)、この差分の表示はドリフトの影響に置き換わってしまいます。データ処理の機能のオプションとして、移動平均の計算前に像のアライメントを試すことが可能であり、またはドリフト補正後のIn-Situ Playerで再生するデータにスクリプトを適用することも出来ます。

最後のスクリプトは、図1Cに示すように元データと同一寸法、同一形状の処理像を出力します。この プロット付きライブしきい値設定 スクリプトは、データにしきい値を設定し最も大きな連続した明るい領域を見つけその上に円形のROIを配置します。スクリプトの詳細についての説明は本アプリケーションノートの目的を逸脱するので触れませんが、大津の手法に基づくしきい値設定といくつかの形態に基づく処理を二値化された像を得るために用いています。その後Scikit-imageをベースにした測定ルーチンを用いて最大の領域の中心と凸領域を識別しています。このスクリプトではDigitalMicrograph上で像にアノーテーション(ここでは円形のROI)を追加する方法のひとつを示しています。またこのスクリプトはラインプロット上にデータをプロットする方法も示しています。スクリプトの実行結果を示す動画は以下のYouTubeのチャンネルからご覧頂くことが出来ます。: DigitalMocrographのPythonを用いたリアルタイムのしきい値設定とトラッキング

次のスクリプト (Live Max FFT) では図1Dに示すように新たな実空間の像ではなくディフラクトグラムを出力します。DigitalMicrographで既に簡単に行うことが可能な像の高速ライブフーリエ変換(FFT) を単に実行するのではなく、このスクリプトでは最大値のFFTを計算します。まず初めに像を複数の小さな領域に分割しそれぞれに対してFFTを計算します。その後全てのFFTを積算したり平均化する代わりに、全ての計算したFFT上の個々のピクセルの最大値を抽出します。この効果はFFTのピクセル分解能を抑えると共に、図2に示すようにひとつの大きなFFTではバックグラウンド強度に埋もれてしまうような微結晶の領域から得られる信号を増幅させることです。

以下のスクリプト (Live Radial Profile) では入力データの次元を下げ各フレームの一次元のプロファイルを生成します。各プロファイルは出力像の列データとして追加され、結果として水平軸は時間、垂直軸は空間周波数となります。このスクリプトで生成されるプロファイルは入力像のFFTから得られた半径方向のプロファイルです。改めて言いますが、この処理の詳細を説明することは本アプリケーションノートの目的を逸脱するので触れません。しかしながら、この処理による結果は、試料中の時間経過に伴う結晶性のあらゆる変化を容易に観察することが可能となります。図1Eに示すように、試料は融解後毎回異なる方位で結晶化を繰り返し、出力される像はこの変化を示しています。

最後のスクリプト (Live FFT Color Map) では試料中の結晶領域のカラーマップを出力します。どのように処理を行っているかの詳細は、ホームページ上の Magnetite nanoparticle orientation mapping from a single low-dose transmission electron microscope (TEM) image の実験概要に記載があります。またはMicroscopy and Microanalysis誌の記事 Direct visualization of the earliest stages of crystallization にも記述があります。このスクリプトでは、ほとんどの行で独自のPythonコードが必要であり、PyPI で利用可能なモジュールやPipからインストール可能なモジュール(pip install BenMillerScripts)に依存しています。これはここで紹介している中で最も動作が遅いスクリプトであり、ほとんどの時間が入力像の重複領域からの多くのFFTの計算に割かれています。しかしながら、このスクリプトは実験中にユーザーへの有用なフィードバックを与えるのに十分な速度は実現しています。

これらのライブビュー処理スクリプトのもう一つの特長は、複数のスクリプトが同時に実行出来ることにあります。下記の図3では、In-Situ Playerで再生しながらひとつのデータセットに対して合計7つのスクリプトを同時に実行しています。ここでは各フレームは僅か870×870ピクセルであり、はるかに大きなデータセットから切り取っています。結果として、各フレームに対する計7つの処理に要する時間は1秒以下に抑えられています。

図3 ここまで示してきた7つのスクリプト全てを同時に処理した場合の動作を示すビデオ。データは温度を変化させた場合のSnナノ粒子の融解と結晶化を示しています。

これらのスクリプトの第一の目的は、研究者それぞれのアプリケーションに基づくスクリプトを作成するためのテンプレートとして役立つことです。Pythonは画像処理と解析に対して非常に強力で広く知られた言語でありながら無償でもあるため、多くの研究者が各々のニーズに応えられるようこれらのスクリプトを変更することが出来ます。データ取得中のリアルタイムデータ解析機能を導入することで、電子顕微鏡前での重要な判断のための材料が得られます。