163 lines
4.5 KiB
Python
163 lines
4.5 KiB
Python
import scipy.io as sio
|
||
import os
|
||
from PIL import Image
|
||
import matplotlib as mpl
|
||
import matplotlib.pyplot as plt
|
||
import time
|
||
import numpy as np
|
||
import skimage
|
||
from skimage import draw
|
||
#import cv2
|
||
|
||
IMAGE_SHAPE = (512, 512, 1)
|
||
WINDOW_SHAPE = (50, 50)
|
||
STEP_SIZE = (7, 7)
|
||
|
||
def correct_image_path(path_imageBF):
|
||
pl = path_imageBF.split(':')
|
||
correct_path = 'I:' + pl[1]
|
||
return correct_path
|
||
|
||
|
||
def load_csg(filename_csg):
|
||
mat_contents = sio.loadmat(filename_csg)
|
||
hh = mat_contents['hh']
|
||
val = hh[0, 0]
|
||
seg_data = dict()
|
||
seg_data['cellsegperim'] = val['cellsegperim']
|
||
seg_data['filenameBF'] = val['filenameBF']
|
||
seg_data['path_imageBF'] = str(val['pathnameBF'][0])
|
||
# 下步仅用于矫正不同机器上驱动器名称的误差
|
||
seg_data['path_imageBF'] = correct_image_path(seg_data['path_imageBF'])
|
||
return seg_data
|
||
|
||
|
||
def transform_cellseg(cellseg):
|
||
cellsegs = list()
|
||
for i in range(cellseg.shape[0]):
|
||
seg = cellseg[i, 0]
|
||
if(seg.shape[1]==2):
|
||
cellsegs.append(seg)
|
||
return cellsegs
|
||
|
||
|
||
def get_seg_im(seg_data, idx):
|
||
seg_im = dict()
|
||
seg_im['cellseg'] = transform_cellseg(seg_data['cellsegperim'][0, idx])
|
||
seg_im['filenameBF'] = str(seg_data['filenameBF'][0, idx][0])
|
||
image_file = os.path.join(seg_data['path_imageBF'], seg_im['filenameBF'])
|
||
seg_im['imageBF'] = np.array(Image.open(image_file))
|
||
return seg_im
|
||
|
||
|
||
def segperim_generator(seg_data):
|
||
for i in range(seg_data['cellsegperim'].shape[1]):
|
||
seg_im = get_seg_im(seg_data, i)
|
||
yield seg_im
|
||
|
||
|
||
def plot_cellseg(seg_im):
|
||
colormap = mpl.cm.gray
|
||
plt.imshow(seg_im['imageBF'], cmap=colormap)
|
||
for idx in range(len(seg_im['cellseg'])):
|
||
seg = seg_im['cellseg'][idx, 0]
|
||
plt.plot(seg[:, 1], seg[:, 0], 'r')
|
||
plt.plot(find_center(seg)[1], find_center(seg)[0], 'r*')
|
||
plt.show()
|
||
|
||
|
||
def find_center(seg):
|
||
c_mean = np.mean(seg[:, 1])
|
||
r_mean = np.mean(seg[:, 0])
|
||
return (int(r_mean), int(c_mean))
|
||
|
||
|
||
|
||
|
||
|
||
"""
|
||
def get_circle(seg):
|
||
circle = np.zeros(IMAGE_SHAPE)
|
||
circle[seg[:, 0], seg[:, 1]] = 1
|
||
return circle
|
||
|
||
|
||
def get_circles(seg_im):
|
||
circles = np.zeros(IMAGE_SHAPE)
|
||
for idx in range(len(seg_im['cellseg'])):
|
||
seg = seg_im['cellseg'][idx]
|
||
circles[seg[:, 0], seg[:, 1]] = 1
|
||
return circles
|
||
"""
|
||
|
||
"""
|
||
seg_data = load_csg('E:/LTQ work/tanglab/deepYeast/xy01 1-120.csg')
|
||
seg_im = next(segperim_generator(seg_data))
|
||
plot_cellseg(seg_im)
|
||
"""
|
||
|
||
"""
|
||
# 看来还是不能保存为.mat, 不然再次打开内部结构和数据类型就乱了
|
||
def load_seg_im_data(filename):
|
||
mat_contents = sio.loadmat(filename)
|
||
data = mat_contents['data']
|
||
"""
|
||
|
||
def load_data(filename_list):
|
||
Xy_list = list()
|
||
for filename in filename_list:
|
||
Xy_list.append(np.loadtxt(filename, dtype=np.int32, comments='#', delimiter=' '))
|
||
Xy = np.vstack(tuple(Xy_list))
|
||
np.random.shuffle(Xy)
|
||
X = Xy[:, 1:]
|
||
y = Xy[:, 0]
|
||
X = X.reshape(X.shape[0], WINDOW_SHAPE[0], WINDOW_SHAPE[1])
|
||
return X, y
|
||
|
||
|
||
def load_rect_data(filename_list):
|
||
Xy_list = list()
|
||
for filename in filename_list:
|
||
Xy_list.append(np.loadtxt(filename, dtype=np.int32, comments='#', delimiter=' '))
|
||
Xy = np.vstack(tuple(Xy_list))
|
||
np.random.shuffle(Xy)
|
||
X = Xy[:, 4:]
|
||
y = Xy[:, 0:4]
|
||
X = X.reshape(X.shape[0], WINDOW_SHAPE[0], WINDOW_SHAPE[1])
|
||
return X, y
|
||
|
||
|
||
|
||
|
||
|
||
def save_image(data, path):
|
||
for idx in range(data.shape[0]):
|
||
im = data[idx]
|
||
img = Image.fromarray(np.uint16(im))
|
||
img.save(os.path.join(path, '%s.tif'%idx))
|
||
|
||
|
||
def plot_rect(imageBF, vertex):
|
||
colormap = mpl.cm.gray
|
||
plt.imshow(imageBF, cmap=colormap)
|
||
(r1, r2, c1, c2) = vertex
|
||
plt.plot(np.ones(r2-r1)*c1, np.array(range(r1, r2)), 'r')
|
||
plt.plot(np.ones(r2-r1)*c2, np.array(range(r1, r2)), 'r')
|
||
plt.plot(np.array(range(c1, c2)), np.ones(c2-c1)*r1, 'r')
|
||
plt.plot(np.array(range(c1, c2)), np.ones(c2-c1)*r2, 'r')
|
||
plt.xlim(0, WINDOW_SHAPE[1])
|
||
plt.ylim(WINDOW_SHAPE[0], 0)
|
||
plt.show()
|
||
|
||
def poly2mask(vertex_row_coords, vertex_col_coords, shape):
|
||
fill_row_coords, fill_col_coords = draw.polygon(vertex_row_coords, vertex_col_coords, shape)
|
||
mask = np.zeros(shape, dtype=np.bool)
|
||
mask[fill_row_coords, fill_col_coords] = True
|
||
return mask
|
||
|
||
|
||
def pol2cart(phi, rho):
|
||
x = rho * np.cos(phi)
|
||
y = rho * np.sin(phi)
|
||
return (x, y)
|