kivantium活動日記

プログラムを使っていろいろやります

大腸菌を用いたエッジ検出

2009年にCellに投稿された論文A synthetic genetic edge detection programの紹介記事です。理解が進むごとに更新していきます。

やっていること

生物学の進歩により、現在では大腸菌などの生物に人工的に合成したDNAを組み込んである程度細胞の動作をコントロールできるようになっています。糖尿病患者に必要なインスリン大腸菌に作らせる例が有名です。(現在でも行われているのかはよく知りません)最近ではカイコにインフルエンザのワクチンを合成させることで、既存のワクチンよりも効率よくより高性能なワクチンを作ることができたという報告が話題になりました(The large-scale production of an artificial influenza virus-like particle vaccine in silkworm pupae)。
今回紹介する論文では、画像処理の重要なアルゴリズムの一つであるエッジ検出を大腸菌にやらせています。

エッジ検出とは

エッジ検出とは画像の境界線を見つける処理のことで、画像の特徴を調べる際に使われています。一番単純なアルゴリズムだと画像を白と黒の2色のみにする二値化処理を行ったあと、白いピクセルを一つ一つ見ていき周りの8ピクセルのうち一つでも黒いものがあったらそこを境界とするという方法が使われています。

ということで本当にそんなアルゴリズムで境界検出ができるのか調べてみましょう。

#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char *argv[]){
    //画像の読み込み
    Mat image;
    image = imread(argv[1]);
    if(image.empty()){
        cout << "Image not Found!" << endl;
        return 0;
    }
    //画像のグレースケール化
    Mat gray(image.rows, image.cols, CV_8UC1);
    cvtColor(image, gray, COLOR_BGR2GRAY);

    //画像の二値化
    Mat binary(gray.rows, gray.cols, CV_8UC1);
    threshold(gray, binary, 0, 255, THRESH_BINARY|THRESH_OTSU);
    waitKey(0);

    //エッジ検出
    Mat edge(binary.rows, binary.cols, CV_8UC1);
    //白で初期化
    for(int y=0; y<edge.rows;y++){
        for(int x=0; x<edge.cols; x++){
            edge.data[y*edge.cols+x] = 255;
        }
    }
    //全てのピクセルについてエッジかどうかを調べる
    //画像の端は8近傍のチェックができないためループ範囲をごまかして対処
    for(int y=1; y<binary.rows-1;y++){
        for(int x=1; x<binary.cols-1; x++){
            int index = y*binary.cols+x;
            if(binary.data[index] == 255){      //二値化画像が白だった場合
                //8近傍のチェック
                bool isEdge=false;
                if(binary.data[index-1]==0)           isEdge = true;    //左
                if(binary.data[index+1]==0)           isEdge = true;    //右
                if(binary.data[index-edge.cols]==0)   isEdge = true;    //上
                if(binary.data[index-edge.cols-1]==0) isEdge = true;    //左上
                if(binary.data[index-edge.cols+1]==0) isEdge = true;    //右上
                if(binary.data[index+edge.cols]==0)   isEdge = true;    //下
                if(binary.data[index+edge.cols-1]==0) isEdge = true;    //左下
                if(binary.data[index+edge.cols+1]==0) isEdge = true;    //右下

                //エッジなら黒で描画
                if(isEdge==true) edge.data[index] = 0;
            }
        }
    }
    
    //画像の表示
    imshow("Original", image);
    imshow("Edge", edge);
    imwrite("edge.png", edge);
    waitKey(0);
    return 0;
}

入力例とそれに対する出力を示します。
f:id:kivantium:20150108220716p:plain:w300 f:id:kivantium:20150108220730p:plain:w300
こんな単純なアルゴリズムでもきれいにエッジが検出できていることが分かります。

しかし、プログラム例を見ていただければ分かるようにこのアルゴリズムはピクセル数に比例する時間がかかってしまいます。しかし、このアルゴリズムはエッジが8近傍だけの情報で決まるため容易に並列化することができます。大腸菌にこのアルゴリズムを実装すれば難しいことを考えずに並列実行してくれます。やったね!(と本当に論文に書いてあった。本気で思ってるのか……?)

基本的なアイデア

先ほどの発想に基づいて大腸菌にエッジ検出をさせるためには次のようなステップを踏めばよいと考えられます。

  1. 大腸菌をシャーレ一面で育てる
  2. 大腸菌の上に光で画像を照射する(図A)
  3. 光が当たっていない大腸菌は周囲にシグナルを送る
  4. 光が当たっている、かつシグナルを受け取った大腸菌は色素を合成する(図B)

こうすれば先ほどの8近傍法と同じ理屈で、光の境界部分にある大腸菌だけが色素を合成しエッジが検出できるはずです。

http://www.ncbi.nlm.nih.gov/pmc/articles/PMC2775486/bin/nihms-123045-f0001.jpg

この動作を実現するための遺伝子回路が図Dに示されています。

ここからの説明は若干の分子生物学の知識が必要になります。細胞の中ではDNAの情報をもとにタンパク質が合成され、タンパク質が各種の機能を実現しています。タンパク質を合成する際には、DNAからRNAポリメラーゼというタンパク質によってmRNAというRNAが合成され(これを転写という)、リボソームという物質によってmRNAの情報を元にタンパク質が合成(これを翻訳という)されます。DNAにはプロモーターと呼ばれる部位があり、プロモーターに転写因子と呼ばれる物質がくっつくと物質の種類に応じて転写が促進されたり抑制されたりします。転写因子を制御することでスイッチのような機能を実現することができるにです。以下の説明はそれを念頭に読んでください。

Dark Sensorは光感受性タンパク質Cph8、Cph8の働きを助けるho1とpcyA、PompCプロモーターから構成されます。Cph8は赤い光が当たると緑の丸で示されたリン酸がOmpR(オレンジのダンベルみたいなやつ)と結合するのを妨げます。PompCプロモーターはOmpRがリン酸と結合している時だけ活性化するので、光が当たるとPompCプロモーター以降の遺伝子発現が起こらなくなります。そのため、この回路は光がない場合にだけ遺伝子を発現させるNOT回路として働きます。

X AND (NOT Y)では、Dark Sensorの働きによって光が当たっていない場合にだけLuxIとcIが発現します。LuxIは大腸菌間のシグナル伝達を担うAHLを合成します。そのため上の「光が当たっていない大腸菌は周囲にシグナルを送る」を実現することができます。AHLは後ろの回路で常に生成されているLuxRと結びつくことで、Plux-λをONにします。しかし、cIはその作用を抑制する働きを持っています。そのためcIが存在しない状態(つまり光が当たっている)でAHLがある(光が当たっていない or 周囲がシグナルを出している)場合にのみPlux-λがONになることになります。Plux-λがONになるとBlack Pigmentの部分が発現し色素が合成されます。従ってこの回路を使うことで「光が当たっている、かつシグナルを受け取った大腸菌は色素を合成する」という動作を実現することができます。

よってこのような回路を大腸菌に組み込めばエッジの検出を行うことができるはずです。

結果

さきほどの働きを実現する遺伝子をプラスミドに組み込み、プラスミドを持った大腸菌を培地の上で増殖させます。そこに光を当ててどうなったかを示した図がこれです。
http://www.ncbi.nlm.nih.gov/pmc/articles/PMC2775486/bin/nihms-123045-f0004.jpg
それなりにきちんとエッジの検出ができていることが分かります。

論文では他にも各物質がどのように拡散するかのモデルを立てて分析したり、本当に光を当てたときに遺伝子発現が抑制されるのかを確認したりしていますが今日のところは割愛します。

感想

それ、大腸菌でやる必要あった?