Segmentation 3D#

0. Imports#

[1]:
import openalea.phenomenal.data as phm_data
import openalea.phenomenal.display.notebook as phm_display_notebook
import openalea.phenomenal.object as phm_obj
import openalea.phenomenal.segmentation as phm_seg
from openalea.phenotyping_data.fetch import fetch_all_data

1. Prerequisites#

1.1 Load cloud point of voxel centers#

[2]:
plant_number = 2
voxels_size = 16
data_dir = fetch_all_data(f"plant_{plant_number}")
[3]:
bin_images = phm_data.bin_images(data_dir)
calibrations = phm_data.calibrations(data_dir)
voxel_grid = phm_data.voxel_grid(data_dir, voxels_size=voxels_size)
/home/docs/checkouts/readthedocs.org/user_builds/phenomenal/checkouts/stable/src/openalea/phenomenal/object/image3D.py:91: UserWarning: Reading `.npy` or `.npz` file required additional header parsing as it was created on Python 2. Save the file again to speed up loading and avoid this warning.
  image = npz["image"]
/home/docs/checkouts/readthedocs.org/user_builds/phenomenal/checkouts/stable/src/openalea/phenomenal/object/image3D.py:93: UserWarning: Reading `.npy` or `.npz` file required additional header parsing as it was created on Python 2. Save the file again to speed up loading and avoid this warning.
  world_coordinate = tuple(npz["world_coordinate"])

1.2 Display voxel grid#

[4]:
phm_display_notebook.show_voxel_grid(voxel_grid, size=1)

2. Skeletonization#

2.1 Compute Graph and the skeleton#

Compute the skeleton of the plant voxelgrid

[5]:
graph = phm_seg.graph_from_voxel_grid(voxel_grid, connect_all_point=True)
voxel_skeleton = phm_seg.skeletonize(voxel_grid, graph)

2.2 Display it#

[6]:
phm_display_notebook.show_skeleton(voxel_skeleton, with_voxel=True, size=1)

2.3 Remove not enouth visible segment#

[7]:
# Select images
image_projection = list()
for angle in bin_images["side"]:
    projection = calibrations["side"].get_projection(angle)
    image_projection.append((bin_images["side"][angle], projection))

voxel_skeleton_denoised = phm_seg.segment_reduction(
    voxel_skeleton, image_projection, required_visible=5, nb_min_pixel=400
)

2.4 Display it#

[8]:
phm_display_notebook.show_skeleton(voxel_skeleton_denoised, size=1)

3. Maize Segmentation#

3.1 Process#

Voxel skeleton are segmented in several label “stem”, “mature_leaf”, “growing_leaf” and “unknow”

[9]:
vms = phm_seg.maize_segmentation(voxel_skeleton_denoised, graph)

3.2 Write / Read#

[10]:
# Write
vms.write_to_json_gz("voxel_maize_segmentation.json")
[11]:
# Load
vms = phm_obj.VoxelSegmentation.read_from_json_gz("voxel_maize_segmentation.json")

3.3 Display#

[12]:
phm_display_notebook.show_segmentation(vms, size=1)

4. Maize Analysis#

4.1 Process#

[13]:
vmsi = phm_seg.maize_analysis(vms)

4.2 How to save analysis result :#

[14]:
vmsi.write_to_json_gz("voxel_maize_segmentation_info.json.gz")
[15]:
vmsi = phm_obj.VoxelSegmentation.read_from_json_gz(
    "voxel_maize_segmentation_info.json.gz"
)

4.3 Visualize results:#

[16]:
phm_display_notebook.show_segmentation(vmsi, size=1)