2016-05-06 13 views
2

私は、96ウェルプレート(以下の画像)から画像を取得する自動顕微鏡プログラムからの画像の配列を持っています。各画像は、以下のように命名される:画像の配列をつなぎ合わせる最も平凡な方法

<Well name>_s<site number>.tif

96ウェルプレートの各ウェルは、さらにサイトに細分化され、サイトがY行列によってXに配置されており、数字は、以下の(線で画像をラインに配置されています)。例えば

96 well plate layout

Site layout

、96ウェルプレートにウェル左上の(10,9)番目の部位が A01_s90.tif命名される画像。

画像をつなぎ合わせるのに最もPythonicな方法は何ですか?私は現在OpenCVを使用して画像をロードしており、が表示されていますが、これは非常に扱いにくいようですが、numpy.concatenateを呼び出しています。

+1

それは呼び出しごとにデータのコピーを強制するため、非常に非効率的です。サブリストを 'list'の中に蓄積し、それらを' for'ループの外側に連結する方が良いでしょう。または、大きな配列に最終イメージと同じサイズを初期化し、スライスインデックスを使ってサブ配列を書きます。 –

答えて

2

次のようなコードですか?私はそれが問題であり、ファイル名と井戸/サイトのインデックス間の変換ではなく、ステッチングであると仮定しています。 for`ループ `内部の配列を連結

import numpy as np 
import matplotlib.pyplot as plt 

img_xsize, img_ysize = 20, 20 # size of single image 
mx, my = 10, 10 # x/y grid of sites per well 
nx, ny = 12, 8 # x/y grid of wells per plate 
wgap = 20 # pixels gap between wells 
stitched_x, stitched_y = (wgap+mx*img_xsize)*nx, (wgap+my*img_ysize)*ny 

img_stitched = np.zeros((stitched_y, stitched_x), dtype=np.uint8) 

def add_img(mxi, myi, nxi, nyi, img): 
    assert img.shape == (img_ysize, img_xsize) 
    xi = nxi*(mx*img_xsize + wgap) + mxi*img_xsize 
    yi = nyi*(my*img_ysize + wgap) + myi*img_ysize 
    img_stitched[yi:yi+img_ysize,xi:xi+img_xsize] = img 

for nxi in range(nx): 
    for nyi in range(ny): 
     for mxi in range(mx): 
      for myi in range(my): 
       # ... get image data 
       img = np.random.randint(0,255) * np.ones((img_ysize, img_xsize), dtype=np.uint8) 
       add_img(mxi, myi, nxi, nyi, img) 

plt.imshow(img_stitched) 
plt.colorbar() 
plt.show(block=False) 
raw_input("Enter") 
+0

このアルゴリズムは、実装時に前の連結ベースのアルゴリズムよりもはるかに高速でしたが、コードの観点からははるかに巧妙でした。 –

関連する問題