McCormik Validation#

Import Statement :#

First make sure you have installed pandas and ipyvolume. When using virtualenv and working in an activated virtual environment, the –sys-prefix option may be required to enable the extension and keep the environment isolated (i.e. jupyter nbextension enable –py widgetsnbextension –sys-prefix).

[1]:
%matplotlib inline

import matplotlib.pyplot as plt
import numpy
import pandas


import openalea.phenomenal.object as phm_obj
import openalea.phenomenal.mesh as phm_mesh
import openalea.phenomenal.segmentation as phm_seg
import openalea.phenomenal.display.notebook as phm_display_notebook
import openalea.phenomenal.data as phm_data
from openalea.phenotyping_data.fetch import fetch_all_data

1. Import McCormik data#

1.1 Select plant_number#

[2]:
data_dir = fetch_all_data("mccormick_plant_2") # only 1 or 2 available
Downloading file 'mccormick_plant_2/segmentedMesh.ply' from 'https://raw.githubusercontent.com/openalea/phenotyping_data/main/data/mccormick_plant_2/segmentedMesh.ply' to '/home/docs/.cache/phenotyping_data'.
[3]:
vertices, faces, colors = phm_data.mesh_mccormik_plant(data_dir)
colors = colors[:, :3].astype(float) / 255.0

1.2 Viewing#

[4]:
phm_display_notebook.show_mesh(vertices, faces, color=colors)

2. Phenomenal Measurements#

2.1 Voxelization#

[5]:
voxels_size = 4.0
voxels_position = phm_mesh.from_vertices_faces_to_voxels_position(
    vertices, faces, voxels_size=voxels_size
)
voxels_position = numpy.array(voxels_position)
voxel_grid = phm_obj.VoxelGrid(voxels_position, voxels_size)

1.2 Viewing#

[6]:
phm_display_notebook.show_voxel_grid(voxel_grid, size=0.4)

2.3 Skeletonization#

[7]:
graph = phm_seg.graph_from_voxel_grid(voxel_grid)
voxel_skeleton = phm_seg.skeletonize(voxel_grid, graph)
[8]:
# Display it
phm_display_notebook.show_skeleton(voxel_skeleton, with_voxel=True, size=0.4)

2.4 Cereals Segmentation#

[9]:
vms = phm_seg.maize_segmentation(voxel_skeleton, graph)
vmsi = phm_seg.maize_analysis(vms)
[10]:
# Phenomenal measurements of each organs
pm_rows = [vo.info for vo in vmsi.voxel_organs] + [vmsi.info]
[11]:
# Display it
phm_display_notebook.show_segmentation(vmsi, size=0.4)

3. McCormik measurement#

[12]:
stem_color = (0, 1, 1)
index = numpy.apply_along_axis(numpy.array_equal, 1, colors, stem_color)
v = vertices[index]

mccm_rows = list()
row = dict()
row["mccm_label"] = "plant"
row["mccm_number_of_leaf"] = len(set(map(tuple, colors))) - 1
mccm_rows.append(row)

row = dict()
row["mccm_label"] = "stem"
row["mccm_length"] = numpy.max(v[:, 2]) - numpy.min(v[:, 0])
mccm_rows.append(row)

4. Measures registration#

[13]:
def registration_row(pm_rows, sm_rows):
    def same_label(pm_row, sm_row):
        for label in ["stem", "plant"]:
            if pm_row["pm_label"] == label and sm_row["mccm_label"] == label:
                return True
        return False

    registered_row = list()
    for pm_row in pm_rows:
        for sm_row in sm_rows:
            if same_label(pm_row, sm_row):
                registered_row.append((pm_row, sm_row, 0))
                continue
            else:
                continue

    return registered_row
[14]:
labels = ["pm_label", "pm_length", "pm_number_of_leaf"]

rows = list()
for pm_row, mccm_row, d in registration_row(pm_rows, mccm_rows):
    for label in labels:
        if label in pm_row:
            mccm_row[label] = pm_row[label]
    rows.append(mccm_row)

df = pandas.DataFrame(rows)

5. Measures Comparison#

[15]:
df_filtred_label = df[df["pm_label"] == "stem"]
plt.plot(df_filtred_label["mccm_length"], df_filtred_label["pm_length"], "g+")
df_filtred_label = df[df["pm_label"] == "plant"]
plt.plot(
    df_filtred_label["mccm_number_of_leaf"], df_filtred_label["pm_number_of_leaf"], "k+"
)

plt.xlabel("Phenomenal measurements")
plt.ylabel("McCormik measurements")

m = int(max([df[k].max() for k in ["pm_length", "mccm_length"]]))

plt.plot(range(m), range(m), "k--")
[15]:
[<matplotlib.lines.Line2D at 0x71a3e1db82d0>]
../_images/examples_McCormick_Validation_24_1.png