Add files via upload
This commit is contained in:
parent
8cb973f7b5
commit
d9b02aee8d
1 changed files with 91 additions and 0 deletions
91
initial_cell_estimate.py
Normal file
91
initial_cell_estimate.py
Normal file
|
@ -0,0 +1,91 @@
|
|||
import numpy as np
|
||||
import torch
|
||||
import matplotlib.pyplot as plt
|
||||
import skimage
|
||||
|
||||
filename: str = "example_data_crop"
|
||||
threshold: float = 0.8
|
||||
tolerance: float = 1.0
|
||||
minimum_area: int = 100
|
||||
|
||||
torch_device: torch.device = torch.device(
|
||||
"cuda:0" if torch.cuda.is_available() else "cpu"
|
||||
)
|
||||
|
||||
print("Load data")
|
||||
input = np.load(filename + str("_decorrelated.npy"))
|
||||
data = torch.tensor(input, device=torch_device)
|
||||
del input
|
||||
print("loading done")
|
||||
|
||||
data = data.nan_to_num(nan=0.0)
|
||||
data -= data.mean(dim=0, keepdim=True)
|
||||
data /= data.std(dim=0, keepdim=True)
|
||||
|
||||
master_image = (data.max(dim=0)[0] - data.min(dim=0)[0]).nan_to_num(nan=0.0).clone()
|
||||
temp_image = master_image.clone()
|
||||
master_mask = torch.ones_like(temp_image)
|
||||
|
||||
stored_contours: list = []
|
||||
counter: int = 0
|
||||
contours_found: int = 0
|
||||
while int(master_mask.sum()) > 0:
|
||||
if counter % 100 == 0:
|
||||
print(
|
||||
f"number of pixel tested: {counter} remaining pixels: {int(master_mask.sum())} cells found: {contours_found}"
|
||||
)
|
||||
counter += 1
|
||||
mask: np.ndarray | None = None
|
||||
|
||||
temp_image *= master_mask
|
||||
|
||||
# Convert index to 2D
|
||||
temp_idx = temp_image.argmax()
|
||||
x = int(temp_idx // int(temp_image.shape[1]))
|
||||
y = int(temp_idx - x * int(temp_image.shape[1]))
|
||||
if bool(master_mask[x, y]) is False:
|
||||
break
|
||||
|
||||
test_data = data[:, x, y].clone()
|
||||
|
||||
# Calculate the correlation
|
||||
scale = (data * test_data.unsqueeze(-1).unsqueeze(-1)).mean(dim=0)
|
||||
scale = scale.nan_to_num(nan=0.0)
|
||||
scale *= master_mask
|
||||
|
||||
# Check for areas with high correlation
|
||||
image = (scale > threshold).type(torch.uint8).cpu().numpy()
|
||||
|
||||
found_something: bool = False
|
||||
# Find the coutours
|
||||
for contour in skimage.measure.find_contours(image, 0):
|
||||
# soften outline
|
||||
coords = skimage.measure.approximate_polygon(
|
||||
contour, tolerance=tolerance
|
||||
).astype(dtype=np.float32)
|
||||
# Make a mask out of the polygon
|
||||
mask = skimage.draw.polygon2mask(scale.shape, coords)
|
||||
assert mask is not None
|
||||
|
||||
# check if this is the contour in which the original point was
|
||||
if mask[x, y]:
|
||||
found_something = True
|
||||
|
||||
if mask.sum() > minimum_area:
|
||||
stored_contours.append(coords)
|
||||
contours_found += 1
|
||||
idx_set_mask = torch.where(torch.tensor(mask, device=torch_device) > 0)
|
||||
|
||||
master_mask[idx_set_mask] = 0.0
|
||||
break
|
||||
|
||||
if found_something is False:
|
||||
master_mask[x, y] = 0.0
|
||||
print("-==- DONE -==-")
|
||||
np.save("cells.npy", np.array(stored_contours, dtype=object))
|
||||
|
||||
plt.imshow(master_image.cpu(), cmap="hot")
|
||||
for i in range(0, len(stored_contours)):
|
||||
plt.plot(stored_contours[i][:, 1], stored_contours[i][:, 0], "-g", linewidth=2)
|
||||
plt.colorbar()
|
||||
plt.show()
|
Loading…
Reference in a new issue