memoryfolder

メモです

無数の点光源画像からPSFを求めるpythonコード

MMDMを使ったmicroscopyの収差補正のテストをしています。
直径100nmのtetraspekをつかって画像が見えたのは良いんですが、zernike係数を動かしたりした時のPSFの変化が解析出来ないと困るのでpythonでコードを書いてみます。

解析したいのは下のような画像。
(画像)

まずは
画像からピークを検出して表示 - memoryfolder
でやったようにピークを検出してその中心位置をarrayとして得る。その過程でピークの数も得られる。

次に、その中心位置が画像の端でないか確認して40*40 pixelのPSFを40*40*(peak number)のarrayに入れていく。

最後にpeaksをaxis=2に対して平均すれば、平均のPSFが分かる。この際すべてのPSFをフィッティングして合わないものを排除すればさらに正確を期せるはず

コードはこちら、汚いですが。

>||
import matplotlib.pyplot as plt
import skimage.morphology as morph
from skimage.filters import threshold_adaptive
import numpy as np
import math
from scipy.ndimage.filters import gaussian_filter
from scipy.ndimage.measurements import label, center_of_mass
from PIL import Image as pil


image = "ImageSingle.png"
im =np.array(pil.open(image))[:,:,1]/255. #retrieve monochro image

#get peak positions
disk = morph.disk(2)
filt = gaussian_filter(im,3)#1
thres = threshold_adaptive(filt, 35, offset=-0.28)#13,-150
#er = morph.erosion(thres,disk)
#xlist, ylist = np.unravel_index(np.where(thres.ravel()==True),thres.shape)#atom place
lbl,num = label(thres)
peaklist = center_of_mass(thres,lbl,np.arange(num)) #position list

#get peak shapes... 40*40pixels?
peaks = np.zeros([num,40,40])
for i in xrange(num):
if peaklist[i][0]>0: #avoid using "nan" data
if (peaklist[i][0]>20)&(peaklist[i][0]<932)&(peaklist[i][1]>20)&(peaklist[i][1]<932): #avoid peaks around edge
print i
peaks[i] = im[int(peaklist[i][0])-20:int(peaklist[i][0])+20,int(peaklist[i][1])-20:int(peaklist[i][1])+20]

#average and display result
peak = np.average(peaks,axis=0)

plt.figure()
plt.imshow(im)
plt.figure()
plt.imshow(peak)
plt.show()
|