生成AIで作ったPythonプログラムで、数値化した画像の解析を自動化〜自宅でできる簡単な研究(FR-1.5)

 数値化した画像のデーターを解析するPythonのプログラムを生成AIを使って作成したので紹介します。目的は、呈色反応などのウェル間の色の違いを数値化して比較をするためで、画像データーをImageJで数値化し得られたのcsvファイルのデーター処理する方法です。
 呈色反応の結果をデジカメでデジタル画像を取得して、ImageJで数値化する方法は ImageJを用いた呈色反応モデルの画像解析法呈色反応モデル画像の数値化をImageJのマクロで自動化 で紹介しております。
 ここでは、自作したPythonのプログラムは、本人でも理解し直すのに多大な時間を要する状態でしたので、改めて生成AI (Bing) を使って作成したものを紹介します。

考え方と目次

何かの役には立たないし、人から見たらどうでも良いことで自己満足の世界でありますが、デンプンやタンパク質を測定する実験の構想で述べた考えをもとに個人研究として取り組んでいます。

目次
 1. ImageJで得られた数値データーの整理
 2. 解析方法の考え方(変数の設定)
 3. 解析プログラム作成のBingへの質問と回答
 4. 完成したプログラムと結果

1. ImageJで得られた数値データーの整理
 下の写真は食紅の緑色の2倍希釈系列で、画像をImageJで選択し解析する例です。この時、ウェルの左端から右端の矢印の範囲を選択します。

画像をImageJで数値化する操作

 (1) Edit >> Copyメニューで解析領域をコピー
 (2) File >> New >> Internal Clipboardメニューで解析領域をペースト
 (3) Image >> Split Channelsを実行
   "red","green","blue"のチャンネルに色分解される
   一番上に表示されているアクティブな"blue"のチャンネルの画像を解析する
 (4) Edit >> Invertで色分解されたの画像を反転
 (5) Edit >> Selection >> Select Allで選択
 (6) Analyze >> plot Profileを実行
 (7) 解析データーをCSVファイルに名前をつけて保存
 (8) 解析を終了した"blue"のチャンネルのProfileと画像を閉じる 

 上記の「画像をImageJで数値化する操作」を実行すると(詳細は、ImageJを用いた呈色反応モデルの画像解析法 または、呈色反応モデル画像の数値化をImageJのマクロで自動化 で報告した方法を参照して下さい)、Red, Green, Blueチャンネルの数値データがcsvファイルの形でファイルに保存されます。ファイルは、下の写真の左のようになっています。

 まず、このRed, Green, Blueチャンネルのデーター(ファイル名は、それぞれ Red_m_, Green_m_, Blue_m_)を1つのファイルに統合するプログラムをBingで質問し、作成してみました。ここで、Pandas(パンダス)などのライブラリーを使わないことにしました。

 質問は、

Bing への質問_1

Pythonでライブラリーを使わずcsvファイル’Red_m_’の2行目から最後まで、2列目の値をR0、3列目の値をR1、’Green_m_’の2行目から最後まで3列目の値をG1、’Blue_m_’の2行目から最後まで3列目の値をB1として、新しく作った’RGB’ファイルにR0, R1,G1,B1の順に記入し、CSVファイルを作るプログラムを書いて。

です。結果は、

となりました。これをPythonで実行するとRGBファイルに統合されています(上の’CSV統合’写真右)。左から1列目は、x軸の直線に沿った距離、2列目から4列めはそれぞれR, G, Bチャンネルの直線に沿ったピクセルの輝度(Y)の値を示します。

2. 解析方法の考え方(変数の設定)
 ImageJで得られたデーターをウェルごとの値にするには、X軸におけるウェルの中心から設定した範囲の数値(Y)の平均を求めます。

 左端のウェルの中心のX軸の距離をx1、右端のウェルの中心のX軸の距離x2とします。隣のウェルの中心距離をc1とし、c1の1/6の値をz1, z2としました(ウェルの直径の約1/3)。ウェルの数をw1と定義しました。

3. 解析プログラム作成のBingへの質問と回答
 上記の変数を設定し、以下の質問をしました。

Bing への質問_2

pythonでライブラリーを使いません。
x1=100, x2=1000, w1=8として c1を(x2-x1)/(w1-1)の整数とします。
z1=x1-c1/6, z2=x1+c1/6
csvファイル’RGB.csv’の1列目の値nががz1以上の時、2列目の小数点を含む値をr1としr2+=r1を、3列目の小数点を含む値をg1としg2+=g1を、2列目の小数点を含む値をb1としb2+=b1をnの値がz2以下になるまでくりかえす。結果を’RGB_Ave’ファイルに記入するCSVファイルを作るプログラムを書いて。

 結果は、下の写真の答えが返ってきました。

 下の写真の赤字で黄色枠の部分に追加と訂正をしました。

 ’n2 = int(z2)-int(z1)+1’は、ウェルの中心から設定した範囲の数値(Y)の数、RGB_Ave.csvファイルに結果を追記するので’w’から’a’に変更、背筋を求めるので’c1’から’n2’に変更しました。

 左のウェルから順番に上記の解析を実施するための質問は、

Bing への質問_3

pythonでライブラリーを使いません。x=x1+c1*a、a+=1としてi=1からi=w1まで操作を繰り返すプログラムを教えて。


 としました。その答えは、

4. 完成したプログラムと結果
 繰り返しのプログラム

a = 0
for i in range(w1):
    x = x1 + c1 * a  #well-1の中心からwellのa番目の中心位置
    a += 1

 を加えたプログラムは、以下となります。

import csv

with open('Red_m_.csv') as red_file, open('Green_m_.csv') as green_file, open('Blue_m_.csv') as blue_file, open('RGB.csv', mode='w', newline='') as rgb_file:
    red_reader = csv.reader(red_file)
    green_reader = csv.reader(green_file)
    blue_reader = csv.reader(blue_file)
    rgb_writer = csv.writer(rgb_file)

    # Skip the first row of each file
    next(red_reader)
    next(green_reader)
    next(blue_reader)

    for red_row, green_row, blue_row in zip(red_reader, green_reader, blue_reader):
        R0 = red_row[0]
        R1 = red_row[2]
        G1 = green_row[2]
        B1 = blue_row[2]

        rgb_writer.writerow([R0, R1, G1, B1])

x1 = 103
x2 = 1621
w1 = 8
c1 = (x2 - x1) // (w1-1)

a = 0
for i in range(w1):
    x = x1 + c1 * a  #well-1の中心からwellのa番目の中心位置
    a += 1
    
    z1 = x - c1 / 6
    z2 = x + c1 / 6

    n2 = int(z2)-int(z1)+1
    
    r2 = 0
    g2 = 0
    b2 = 0

    with open('RGB.csv') as f:
        reader = csv.reader(f)
        for row in reader:
            n = int(row[0])
            if n >= z1:
                r = float(row[1])
                g = float(row[2])
                b = float(row[3])
                r2 += r
                g2 += g
                b2 += b
            if n > z2:
                break

    with open('RGB_Ave.csv', 'a') as f:
        writer = csv.writer(f)
        writer.writerow(['{:.2f}'.format(r2 / n2), '{:.2f}'.format(g2 / n2), '{:.2f}'.format(b2 / n2)])

 変数の値を
  x1 = 103(左端ウェルの中心のx軸の値)
  x2 = 1621(右端ウェルの中心のx軸の値)
  w1 = 8(ウェルの数)
 として、上のプログラムを実行すると写真左の様なcsvデーターがRGB_Ave.csvファイルに書き込まれ、グラフにすると下の写真右になります。

 複数のウェルの行を処理するには、上記のプログラムをsubにし、Mainのプログラムで繰り返しやファイルの処理をすると良いかも知れません。

 最後に、食紅(赤色105号)を使ってタンパク質の定量する方法の解析に使っています(食紅を使ったタンパク質の定量法)。よろしかったらご覧ください。