Elementary plastic rearrangement (T1) detection¶
In this jupyternotebook we are going to detect T1 events between each individual bubble in a set of images.
# Import Libraries
import numpy as np
import matplotlib.pyplot as plt
from tifffile import imread, imsave
import skimage.measure
import pickle as pkl
import os
import spam
# Import FoamQuant library
from FoamQuant import *
# Set matplotlib default font size
plt.rc('font', size=25)
# Create the processing pipeline
ProcessPipeline = ['P4_BubbleSegmented','P5_BubbleNoEdge','Q7_RegProp','Q8_Tracking',
'Q9_Contacts','Q10_Translated','Q11_LostNewContacts','Q12_T1']
for Pi in ProcessPipeline:
if os.path.exists(Pi):
print('path already exist:',Pi)
else:
print('Created:',Pi)
os.mkdir(Pi)
path already exist: P4_BubbleSegmented
path already exist: P5_BubbleNoEdge
path already exist: Q7_RegProp
path already exist: Q8_Tracking
path already exist: Q9_Contacts
path already exist: Q10_Translated
path already exist: Q11_LostNewContacts
path already exist: Q12_T1
A) Type of imput data¶
The images we are extracting the individual bubble stress tensor are bubble-segmented images with removed labels on the edge of the images.
# Read/Save image names and directories
dirread = ProcessPipeline[1]+'/'
nameread = 'BubbleNoEdge_'
imrange = [1,2,3,4,5]
# Read the first image of the series
Lab = imread(dirread+nameread+strindex(imrange[0], 3)+'.tiff')
# Create a random colormap
rcmap = RandomCmap(5000)
# Show a 3D-cut view of the volume
Cut3D(Lab,
showcuts=True,
cmap=rcmap,
interpolation='nearest',
figblocksize=7, # tune this parrameter to change the figure size
zcut=30, # tune this parrameter to change the orthogonal z-cut position
ycut=False, # tune this parrameter to change the orthogonal y-cut position
xcut=False) # tune this parrameter to change the orthogonal x-cut position
Number of labels: 5000
B) Track the bubbles¶
# Read/Save names and directories
nameread = 'BubbleNoEdge_'
namesave = 'Props_'
dirread = ProcessPipeline[1]+'/'
dirsave = ProcessPipeline[2]+'/'
# Images indexes
imrange = [1,2,3,4,5]
# Region properties
RegionProp_Batch(nameread,
namesave,
dirread,
dirsave,
imrange,
verbose=True,
field=[40,220,40,220,40,220], # tune this parrameter if you wish
endread='.tiff',
endsave='.tsv')
Path exist: True
Props_001: done
Props_002: done
Props_003: done
Props_004: done
Props_005: done
C) Bubble tracking¶
# Read/Save image names and directories
nameread = 'Props_'
namesave = 'Tracking_'
dirread = ProcessPipeline[2]+'/'
dirsave = ProcessPipeline[3]+'/'
# Images indexes
imrange = [1,2,3,4,5]
# Tracking
LabelTracking_Batch(nameread,
namesave,
dirread,
dirsave,
imrange,
verbose=False,
endread='.tsv',
endsave='.tsv',
n0=3,
searchbox=[-10,10,-10,10,-10,10], # tune this parrameter if you wish
Volpercent=0.05) # tune this parrameter if you wish
Path exist: True
100%|██████████| 504/504 [00:00<00:00, 812.91it/s]
Lost tracking: 13 2.579365079365079 %
100%|██████████| 506/506 [00:00<00:00, 792.46it/s]
Lost tracking: 9 1.7786561264822136 %
100%|██████████| 511/511 [00:00<00:00, 803.22it/s]
Lost tracking: 7 1.36986301369863 %
100%|██████████| 514/514 [00:00<00:00, 736.20it/s]
Lost tracking: 16 3.11284046692607 %
D) Contact topology¶
# Read/Save image names and directories
nameread = 'BubbleSeg_'
nameread_noedge = 'BubbleNoEdge_'
namesave = 'Contact_'
dirread = ProcessPipeline[0]+'/'
dirread_noedge = ProcessPipeline[1]+'/'
dirsave = ProcessPipeline[4]+'/'
# Images indexes
imrange = [1,2,3,4,5]
GetContacts_Batch(nameread,
nameread_noedge,
namesave,
dirread,
dirread_noedge,
dirsave,
imrange,
verbose=True)
Path exist: True
Contact_001: done
Contact_002: done
Contact_003: done
Contact_004: done
Contact_005: done
E) Translate contact pairs¶
# Read/Save image names and directories
nameread = 'Contact_pair_'
nameread_track = 'Tracking_'
namesave = 'Translated_pair_'
dirread = ProcessPipeline[4]+'/'
dirread_track = ProcessPipeline[3]+'/'
dirsave = ProcessPipeline[5]+'/'
# Images indexes
imrange = [1,2,3,4,5]
Translate_Pairs_Batch(nameread,
namesave,
nameread_track,
dirread_track,
dirread,
dirsave,
imrange,
endsave='.tsv',
n0=3)
Tracking_001_002 : done
Contact_pair_002: done
100%|██████████| 5026/5026 [00:00<00:00, 5483.67it/s]
Tracking_002_003 : done
Contact_pair_003: done
100%|██████████| 5033/5033 [00:00<00:00, 5498.18it/s]
Tracking_003_004 : done
Contact_pair_004: done
100%|██████████| 5005/5005 [00:00<00:00, 5525.60it/s]
Tracking_004_005 : done
Contact_pair_005: done
100%|██████████| 5037/5037 [00:00<00:00, 5455.60it/s]
F) Detect lost and new contacts¶
# Read/Save image names and directories
pairsdirname = [ProcessPipeline[4]+'/','Contact_pair_']
pairstrldirname = [ProcessPipeline[5]+'/','Translated_pair_']
regdirname = [ProcessPipeline[2]+'/','Props_']
savedirnamelost = [ProcessPipeline[6]+'/','Lost_']
savedirnamenew = [ProcessPipeline[6]+'/','New_']
# Images indexes
imrange = [1,2,3,4,5]
LostNewContact_Batch(pairsdirname,
pairstrldirname,
savedirnamelost,
regdirname,
savedirnamenew,
imrange,
verbose=True)
Contact_pair_001: done
Translated_pair_002: done
Props_001: done
LostContact
100%|██████████| 4960/4960 [00:00<00:00, 16217.84it/s]
>>> Retrieve the coordinates
100%|██████████| 66/66 [00:00<00:00, 5437.30it/s]
1.3306451612903225 %
NewContact
100%|██████████| 5026/5026 [00:00<00:00, 16435.79it/s]
1.2096774193548387 %
Contact_pair_002: done
Translated_pair_003: done
Props_002: done
LostContact
100%|██████████| 5026/5026 [00:00<00:00, 16132.90it/s]
>>> Retrieve the coordinates
100%|██████████| 68/68 [00:00<00:00, 5437.28it/s]
1.3529645841623557 %
NewContact
100%|██████████| 5033/5033 [00:00<00:00, 16098.69it/s]
1.1142061281337048 %
Contact_pair_003: done
Translated_pair_004: done
Props_003: done
LostContact
100%|██████████| 5033/5033 [00:00<00:00, 15592.16it/s]
>>> Retrieve the coordinates
100%|██████████| 83/83 [00:00<00:00, 5058.00it/s]
1.6491158354857938 %
NewContact
100%|██████████| 5005/5005 [00:00<00:00, 15237.07it/s]
1.7683290284124777 %
Contact_pair_004: done
Translated_pair_005: done
Props_004: done
LostContact
100%|██████████| 5005/5005 [00:00<00:00, 16167.55it/s]
>>> Retrieve the coordinates
100%|██████████| 46/46 [00:00<00:00, 5329.19it/s]
0.919080919080919 %
NewContact
100%|██████████| 5037/5037 [00:00<00:00, 16093.94it/s]
1.118881118881119 %
Lost = Read_lostnew(savedirnamelost,
imrange[:-1],
verbose=True)
New = Read_lostnew(savedirnamenew,
imrange[:-1],
verbose=True)
Q11_LostNewContacts/Lost_001_002.tsv
Q11_LostNewContacts/Lost_002_003.tsv
Q11_LostNewContacts/Lost_003_004.tsv
Q11_LostNewContacts/Lost_004_005.tsv
Q11_LostNewContacts/New_001_002.tsv
Q11_LostNewContacts/New_002_003.tsv
Q11_LostNewContacts/New_003_004.tsv
Q11_LostNewContacts/New_004_005.tsv
# Show all the lost and new contact at the first time step
fig, ax = plt.subplots(1,3, figsize = (5*3, 5), constrained_layout=True)
PlotContact(Lost[0],color='r',ax=ax, nameaxes=['z','y','x'])
PlotContact(New[0],color='g',ax=ax, nameaxes=['z','y','x'])
G) Detect T1 events¶
# Read/Save image names and directories
pairsdirname = [ProcessPipeline[4]+'/','Contact_pair_']
readdirnamelost = [ProcessPipeline[6]+'/','Lost_']
readdirnamenew = [ProcessPipeline[6]+'/','New_']
namesave = 'T1_'
dirsave = ProcessPipeline[7]+'/'
# Images indexes
imrange = [1,2,3,4,5]
DetectT1_Batch(pairsdirname,
readdirnamelost,
readdirnamenew,
namesave,
dirsave,
imrange[:-1],
verbose=True,
n0=3)
[1, 2, 3, 4]
Path exist: True
Q11_LostNewContacts/Lost_001_002
Q11_LostNewContacts/New_001_002
Q9_Contacts/Contact_pair_001
100%|██████████| 66/66 [00:00<00:00, 365.20it/s]
100%|██████████| 60/60 [00:00<00:00, 363.57it/s]
T1_001: done
Q11_LostNewContacts/Lost_002_003
Q11_LostNewContacts/New_002_003
Q9_Contacts/Contact_pair_002
100%|██████████| 68/68 [00:00<00:00, 360.37it/s]
100%|██████████| 56/56 [00:00<00:00, 359.14it/s]
T1_002: done
Q11_LostNewContacts/Lost_003_004
Q11_LostNewContacts/New_003_004
Q9_Contacts/Contact_pair_003
100%|██████████| 83/83 [00:00<00:00, 351.87it/s]
100%|██████████| 89/89 [00:00<00:00, 350.14it/s]
T1_003: done
Q11_LostNewContacts/Lost_004_005
Q11_LostNewContacts/New_004_005
Q9_Contacts/Contact_pair_004
100%|██████████| 46/46 [00:00<00:00, 362.46it/s]
100%|██████████| 56/56 [00:00<00:00, 364.62it/s]
T1_004: done
# Read/Save image names and directories
namesave = 'T1_'
dirsave = ProcessPipeline[7]+'/'
# Read the T1
T1_NewLost = ReadT1([dirsave,namesave],imrange[:-1], verbose=False, n0=3)
# show the T1 at the first time step
fig, ax = plt.subplots(1,3, figsize = (5*3, 5), constrained_layout=True)
PlotT1([T1_NewLost[0][0],T1_NewLost[1][0]], ax=ax, color=None, nameaxes=['z','y','x'])