画像処理で胞子カウントは道半ば

学生時代は何しろデジタルカメラもまだない時代で、血球計算盤とカウンターを使って手動で数えていましたが、2020年になってもまだ顕微鏡に接続したカメラで取得した画像をPC上で結合して上でマウスでカチカチカウントしているという、学生時代から進歩したのかしてないのか。疲労は少しだけ軽減したかも。証拠が残るのは重要ですね。画像の結合は面倒ですが。

その後、「楽をするためなら労力を惜しまない」という積極的怠け心を発揮して、何とかカウントまで画像処理で出来るようになりました。それが2021年の方法です。うれしさのあまり2022年2月のきのこ学会第24回大会で発表してしまいましたので、発表したプレゼンを載せます。後でミスが見つかったので訂正済みです。

2022年きのこ学会第24回大会のプレゼン

顕微鏡で写真撮影

撮影には昭和時代の顕微鏡(OPTIPHOT)にも後付けしやすいレイマー(WRAYMER)のNF1000という1,000万画素級のCCDカメラ(これももう旧製品)を使用し、標準添付のCマウントアダプターユニバーサルタイプ(X0.45)で写真鏡筒の投影レンズ取り付け部(内径23.2mm)に差し込んでいます。顕微鏡は有限系のもの(何と「林業試験場」の備品シールが)ですが、ちゃんとメンテすればまだまだいけます。カメラは低価格の汎用機ですが、好きなように使えるのが気に入っています。最近ではVEX120という高感度高速カメラ(アダプターGC037使用)も併用しています。

本題の前に、撮影にまつわるトラブルと解決

・フレームレートが異常に低い

NF1000については当初は組んでみたらモニターのフレームレートが異常に低くて困ったのですが、サポートに問い合わると「接続するUSBポートをオンボードポートにせよ」というアドバイスをくれました。その通りにするとカタログスペック通りになりました。一応最初からオンボードポートのつもりだったのですが、よく見るとマザーボード上の他社製ブリッジチップ経由のUSB3.0ポートに接続していました。それが原因だったらしく、チップセット直付けのUSB2.0ポートに接続したらあっさり解決しました。

なお、NF1000自体は旧製品でもありUSB2.0デバイスです。1,000万画素クラスなのでフルピクセルだと私の環境では3fpsくらいですが、これは正常。低画素モードにすれば高速になるので、撮影時だけフルピクセルにすれば十分です。

・CCD画像のバンディング(横縞ノイズ)

画像のバンディング(横縞模様ノイズ)に悩んだときも、どうにもならなくてサポートにメールしたら即「露出時間を変えれば回避可能」と教えてくれました。レイマー社のテクニカルサポートは驚異的にレスポンスが早くて助かります。

バンディングの原因は光源のハロゲンランプのパワーを位相制御でコントロールしているせいらしく、ハロゲンランプが肉眼では分からないレベルに明滅しているのがCCDの走査周波数と干渉していたみたいです。露出時間をマニュアルで31msくらいに固定すると解消しました。

位相制御というのは、商用電源の交流の波形を1サイクルの一部だけ切り取る制御です。ハロゲンランプを光源とする顕微鏡の多く(といってもオリンパスBH-2とニコンLABOPHOT/OPTIPHOTしか知りませんが普及していたので絶対数は多いでしょう)は、鏡基裏側にマウントされたトランジスター(パワートランジスター、パワトラ)で制御しています。ベース電流を制御してエミッタ・コレクタ間を高速にオンオフすることで、ランプに送る電力の総量をコントロールします。

位相制御はスイッチング制御なので、部分出力領域ではどうしても波形が急峻になります。低出力領域ではオフ時間が長くオン時間が短いので、50Hzまたは100Hz(半波整流または全波整流)、西日本なら60/120Hzのパルスになります。それは明滅もしようというもの。これの影響を消すために露出時間を変えるのですが、周波数とパルス幅の両方の影響を受ける、ということは照明の明るさを変えたら合わせ直しということ。ちょっと面倒ですが、商用周波数ベースの位相制御を行うハロゲンランプ照明では仕方ないですね。LED照明だともっと高周波で制御しているので、こういう問題は起こりにくいはずです。

撮影・カウント

本格的に取り組みはじめて、どんどん手法を更新しています。本当のところ、PythonでAIでとか考えた時期もありましたが、ちょっと手に余るというか、やったら楽しそうでのめり込んでまずいことになりそうで。分かる奴に聞いたら「MATLABを使えば」とか。いやそれは無理。昔は農林水産研究情報総合センターにあったんですけどね。

一番最初にやった方法:2020年版[obsolete]

カウンティングチェンバーでは厚みがあるため撮影時のピントが問題になりますが、数分おいて胞子を落ち着かせたあとは「胞子が一番よく見えるところ」で固定してしまえばいいようです。なまじライブで顕微鏡を覗いていると、ピントをずらして怪しい影が胞子かゴミかを見極めようとして無駄に疲れたりとかしますが、画像にしてしまえばそういうのはすっぱり諦めることができます。ここまではこの先も共通に言えること。

あまりのんびりやっているとブラウン運動で胞子が動いてしまうのでなるべくちゃっちゃと撮ります。互いに3割くらい重なるようにして撮影して、ファイルサーバーに保存します。重なりは画像の結合に必要ですが、胞子が動いてしまうとまずいので。カラーの意味はないのでモノクロで撮影します。ただし、この撮影方法自体もだんだん変わっていきます。

ファイルサーバーから処理用PCに取り込んだ画像は、内容を確認して結合処理へ。画像表示ソフトの老舗に「よくフリーソフトと間違われている」Irfan Viewがあります。ライセンスに書かれていますが業務用途では有償です。それはともかく、Irfan Viewには階調補正機能があり、「Shift + U」一発でかなり見やすく整えてくれるので重宝しています。

画像の結合には、Microsoftが配布している無償ツール"ICE"を使っています。まあ、使えるときは。一般の写真では、十分な重なり幅があればそこそこ出来るはずです。階調を揃えたり細かい調整をしたり、かなり賢いので重宝しています。とはいえこの作業をするのは縦結合に対応したパノラマ写真作成ツールなら何でもかまいません。ただ、普通の写真ではないせいか、出来るときはできるのですが、どうしてもうまくいかないこともわりとあります。あっ、ICEが開発終了になってしまいました。やれやれ。

・画像処理なら楽というわけではない[obsolete]

パノラマ作成ツールが画像の重ね合わせに失敗したりすると、GIMPでの手作業になります。ただしGIMPにも自動パノラマ合成機能があるので、手作業を始める前に試してもいいかも知れません。まずはプラグイン"Pandra"を適切なフォルダー(バージョンによって変わることがあるので最新情報を確認のこと)に入れます。一連写真の最初の1枚を開いたらあとはドラッグ&ドロップで全部の写真をレイヤーにして、「フィルター」「合成」「Arrange as Panorama」です。キャンバスのサイズを拡張しながら並べて、適当に保存します。ここまでやると「カウンターで数えた方が早かったかな」と思わなくもありませんが。

それでもどうしてもうまくいかないときは、原始的にGIMP上で手作業で並べます。最初の画像に1枚追加するごとに、新しい画像レイヤーにレイヤーマスクを追加してグラデーションツール(*)で縁を半透過にしてぐりぐりと動かし、一致したところでレイヤー統合します。横一列つながったら(横スキャンで撮影した場合)、次の列はまた横一列に繋いで別のレイヤーにまとめます。各列をそれぞれのレイヤーにまとめたら、レイヤーごとに下(上でもいいけど)の縁を半透過にして位置合わせをしてレイヤー統合。最終的に全部つなげて余白を切り落として完成。ここまでやるなら絶対に顕微鏡を覗いてカウントした方が早いでしょう。証拠を残せるという利点がなければきっとやらない。

*: グラデーションツールがまた最近のバージョンアップで行われた「ツールボックスのグループ化」のせいでで行方不明になり、メニューの「編集」から「設定」で「ツールボックス」からグループ化を無効にしてやらないと見つからないという。開発が活発であることの副作用かも知れません。

・Fijiでカウント[obsolete]

結合した一枚画像ができたら、Fijiで開きます。Fijiは伝統のNIH Imageの流れを汲むImageJのプラグイン全部入りパッケージです。動作にはJavaが必要です。最近ライセンスが変わったので、Javaの業務利用にはライセンスを購入する必要があります。ICEもGIMPもFijiも無償なのが有り難いですね、なんて言ったらオープンソースの人にぶっ飛ばされそう。

最初に階調補正をかけていなかった場合は、Fijiでもできます。メインメニューの「Image」から「Adjust」→「Brightness & Contrast」で「Auto」をクリックして階調を自動補正します。多用するものだからか「Ctrl + Shift + C」で一発で開けます。するとだいぶ扱いやすい感じになるので、プラグインのセルカウンターで数えます。

メインメニューの「Plugins」から「Analyze」(メインメニューのAnalyzeではない!)→「Cell Counter」→「Cell Counter」を開きます。こんな奥まったところに隠された、あまたの研究者の求めて止まないセルカウンター機能とは、だがしかし画面を手作業でクリックして複数タイプのマークを打ったらタイプごとに数えてくれるという有り難い機能でした。最後は手動かい。まあでもゴミとより分けたり中身のない壊れた胞子を別に数えたりするにはまだまだ人間の判断が必要ですし。

多分画像が大きすぎてFijiの画面では自動ズームで縮小表示されてしまいます。44型4Kモニターとか使っていれば別かも。胞子がよく見える倍率(400倍を主に使用)ではチェンバーの1mm四方は結構広大です。縮小表示では識別してマウスでマークするのが難しいので、手動ズームで拡大します。スクロールはそのまま画像をドラッグするのではなく、Fijiメインウィンドウの掌アイコンのスクロールツールを使います。ただし、「Cell Counter」でInitializeしてから。スクロールツールを選択しているとマークできないので、点々アイコンのマルチポイントツールを選択してからマークます。

野外試料ではどうしたってゴミが入ることを考えると、最終判断は人間がやるくらいがちょうどいいんでしょうね。200個かそこらまでなら大した手間ではありませんし。どっちかというと毎回チェンバーを洗って乾かす方が手間。

2021年版

きのこ学会で発表したのが2021年版です(2022年きのこ学会第24回大会のプレゼン)。簡単に言えば以下の通り。2020年式とは撮影の段階からやり方が違います。

・低解像度・デフォーカスで撮影する

胞子が胞子であること、形がそれらしいことが分かれば十分です。内部構造が見える必要はありません。低倍率(410倍)の対物レンズと低解像度(120万画素)の高速カメラを使います。カウンティングチェンバーの格子線も、あんまりくっきり見えると邪魔です。そこで、ピントを浅くした上でわざとずらしてデフォーカス撮影します。

多分に感覚的な話になって恐縮ですが、ピントはチェンバーの格子線より上、ガラス面に沈んだ胞子よりもさらにわずかに上に合わせます。開口絞り(コンデンサー絞り)も開口数付近まで開きます。これによって格子線がぼやけた影、胞子も黒い影に見えるのが適切なピント位置です。

もちろん、試料室の厚みが保障されている必要があるのでカウンティングチェンバーは必須です。実は格子線のないところでも後からROIを設定すれば出来るのですが、そういう「空中戦」はちょっと怖いような。でもそのうち挑戦するでしょう。

画像形式はGIFを使っています。JPEGは不可逆なのでなるべく避けますが、無圧縮TIFFやWindows BMPは馬鹿でかい。PNG形式だとグレースケールに見えてもRGBで同じ情報を持った無色のカラーなのでポピュラーなところでGIF。昔の特許問題は……過ぎたことは忘れようぜ。

背景を消去する

Fijiを使います。準備として、まずグレースケールにします。
操作はImage -> Type -> 8bit

次に本版の背景消去です。
Process -> Subtract Background
パラメーターはとりあえず50.0で満足いく結果を得ています。照明ムラなどがほぼなくなりました。格子線と胞子はあまり変わらず見えるはずです。

・貼り合わせて切り抜く

410倍の視野ではチェンバー試料室がギリギリ収まらないので、上下2枚の画像を貼り合わせます。方法は何でもいいです。私はGIMPを使いました。

GIMPで画像より二回り大きい下敷きレイヤーを作成し、上下2枚の画像をそれぞれレイヤーとして開いて、上に重なったレイヤーの透明度を半分くらいにしてズリズリ動かしてだいたい重なったら透明度を戻してレイヤーを併合します。2020年式の貼り合わせよりはずっと楽ですが、それでもかなり面倒くさいです。

試料室全体を画像に収めたら、うっすらと写っているはずの試料室の枠線に合わせて矩形選択して、切り取ります。以後は切り取った正方形の画像を対象にします。

二値化する

Fijiを使います。まずは二値化です。Image -> Adjust -> Threshold
もしも格子線がノイズとして残るなら、二値化の前に画像エディターなどで消しておきます。消すのにはもちろん手作業は必要はなく、トーンカーブをいじります。たいていのソフトで傾いた直線になっているトーンカーブを、右上の方をつまんで強制的に天井に張り付けてしまいます。全体的にはちょっと傾きがきつくなります。

トーンカーブをいじっても二値化した時に消えない場合、多少なら手作業で消しますが、あまり経験ありません。全面格子だらけで諦めることは稀にあります。撮影時に光学的に薄める段階で失敗しているとこうなるかも知れません。あと、よく分からない原因でFijiがうまく動作していないとき。たまに似たような他の画像に対するのとは全然違う結果を返してきます。そういうときは、システムを再起動しながらティーブレイクを取ったりします。

なお、複数の胞子がくっついているとよろしくないので、画像エディターを使って背景色の細い線を胞子の間に引いて切り分けることもあります。さもないと例えば3個が1個に数えられたり、大きすぎて胞子ではないとはねられたりしてしまいます。切り分け処理があまり頻繁に必要になるのは、胞子懸濁液が濃すぎる場合でしょう。

二値化して、画面にパラパラと胞子らしい黒い影が散らばるようになったら、完成です。多少のゴミがあっても、胞子と形や大きさが紛らわしくない限り大丈夫です。もしもそういうゴミがある場合は、画像エディターで消しておきます。大丈夫、これは改ざんではありません。正当な前処理です。それでも研究不正に問われるのが心配なら、各ステップの写真を全部残しておきましょう。

・サイズと形を指定して数えさせる

Fijiの分析機能を使います。Analyze -> Analyze Particles
粒子の大きさ制限は、倍率や画素数にもよりますが、私の条件ではSize=10-100pxでうまくいきました。ピクセル数による指定なので、倍率や胞子のサイズの影響を受けます。狙った胞子を拾えてゴミが弾かれるよう決めていきます。真円度制限は紐状とかあんまり変な形のものを弾くもので、Circularity=0.5-1.0としてあります。

なお、この条件ではハルシメジのような角張った胞子でもいけます。逆に細長いものだと調整がいるかも知れません。淡色の胞子だと本気でオフグリッド撮影(いやただ単にチェンバーの格子線を外したところという意味ですけど)が必要かも知れません。

でもねえ、たぶんこれはもっと短縮できるんですよ。まあ実証したら書いていきます。タイム込みで。

2022年版

お楽しみに~

# 昔はこういうときによく「工事中」って書いたもんですが。