Source code for openalea.phenomenal.object.voxelSegmentation

# -*- python -*-
#
#       Copyright INRIA - CIRAD - INRA
#
#       Distributed under the Cecill-C License.
#       See accompanying file LICENSE.txt or copy at
#           http://www.cecill.info/licences/Licence_CeCILL-C_V1-en.html
#
# ==============================================================================
from __future__ import division, print_function, absolute_import

import ast
import os
import gzip

from .voxelOrgan import VoxelOrgan
# ==============================================================================


[docs]class VoxelSegmentation(object):
[docs] def __init__(self, voxels_size): self.voxel_organs = list() self.voxels_size = voxels_size self.info = dict()
def update_plant_info(self): s = set() for vo in self.voxel_organs: s = s.union(vo.voxels_position()) self.info["pm_label"] = 'plant' self.info["pm_voxels_volume"] = len(s) * self.voxels_size ** 3 self.info["pm_number_of_leaf"] = self.get_number_of_leaf() def get_voxels_position(self, except_organs=None): if except_organs is None: except_organs = list() voxels_position = set() for vo in self.voxel_organs: if vo not in except_organs: voxels_position = voxels_position.union(vo.voxels_position()) return voxels_position def get_number_of_leaf(self): number = 0 for vo in self.voxel_organs: if vo.label == "mature_leaf" or vo.label == "growing_leaf": number += 1 return number def get_leaf_order(self, number): for vo in self.voxel_organs: if "pm_leaf_number" in vo.info and vo.info["pm_leaf_number"] == number: return vo return None def swap_leaf_order(self, number_1, number_2): vs1 = self.get_leaf_order(number_1) vs2 = self.get_leaf_order(number_2) vs1.info['pm_leaf_number'] = number_2 vs2.info['pm_leaf_number'] = number_1 def get_stem(self): for vo in self.voxel_organs: if vo.label == "stem": return vo return None def get_unknown(self): for vo in self.voxel_organs: if vo.label == "unknown": return vo return None def get_mature_leafs(self): mature_leafs = list() for vo in self.voxel_organs: if vo.label == "mature_leaf": mature_leafs.append(vo) return mature_leafs def get_growing_leafs(self): growing_leafs = list() for vo in self.voxel_organs: if vo.label == "growing_leaf": growing_leafs.append(vo) return growing_leafs def get_leafs(self): leafs = list() for vo in self.voxel_organs: if vo.label == "growing_leaf" or vo.label == "mature_leaf": leafs.append(vo) return leafs # ========================================================================== # READ / WRITE # ========================================================================== def write_to_json_gz(self, filename): if (os.path.dirname(filename) and not os.path.exists( os.path.dirname(filename))): os.makedirs(os.path.dirname(filename)) with gzip.open(filename, 'wb') as f: data = dict() data['voxels_size'] = self.voxels_size data['voxel_organs'] = list() data['info'] = self.info for vo in self.voxel_organs: dvo = dict() dvo['label'] = vo.label dvo['sub_label'] = vo.sub_label dvo['info'] = vo.info dvo['voxel_segments'] = list() for vs in vo.voxel_segments: dvs = dict() dvs['polyline'] = map(tuple, list(vs.polyline)) dvs['voxels_position'] = map( tuple, list(vs.voxels_position)) dvo['voxel_segments'].append(dvs) data['voxel_organs'].append(dvo) f.write(str(data)) @staticmethod def read_from_json_gz(filename, without_info=False): with gzip.open(filename, 'rb') as f: data = ast.literal_eval(f.read()) vms = VoxelSegmentation(data['voxels_size']) for dvo in data['voxel_organs']: vo = VoxelOrgan(dvo['label']) if 'sub_label' in dvo: vo.sub_label = dvo['sub_label'] if not without_info: vo.info = dvo['info'] for dvs in dvo['voxel_segments']: voxels_position = set(map(tuple, dvs['voxels_position'])) polyline = map(tuple, list(dvs["polyline"])) vo.add_voxel_segment(voxels_position, polyline) vms.voxel_organs.append(vo) vms.update_plant_info() return vms