diff --git a/io/cells.py b/io/cells.py
index 8ef526fbd8fb9f2a72adda11db67ad62317f170a..fd484c90173f7ff1aeb950b5f3dd77a35fd84f99 100644
--- a/io/cells.py
+++ b/io/cells.py
@@ -51,7 +51,7 @@ class Cells:
         # Convert sparse arrays if needed and if kind is 'mask' it fills the outline
         array = Cells._asdense(array)
         if kind == "mask":
-            array = ndimage.binary_fill_holes(array).astype(int)
+            array = ndimage.binary_fill_holes(array).astype(bool)
         return array
 
     @classmethod
@@ -192,6 +192,53 @@ class CellsHDF(Cells):
         return self.group_by_traps(traps, labels)
 
 
+class CellsLinear(CellsHDF):
+    """
+    Reimplement functions from CellsHDF to save edgemasks in a (N,tile_size, tile_size) array
+    """
+
+    def __init__(self, filename, path="cell_info"):
+        super().__init__(filename, path=path)
+
+    def __getitem__(self, item):
+        assert item != "edgemasks", "Edgemasks must not be loaded as a whole"
+
+        _item = "_" + item
+        if not hasattr(self, _item):
+            setattr(self, _item, self._fetch(item))
+        return getattr(self, _item)
+
+    def _fetch(self, path):
+        with h5py.File(self.filename, mode="r") as f:
+            return f[self.cinfo_path][path][()]
+
+    def _edgem_from_masking(self, mask):
+        with h5py.File(self.filename, mode="r") as f:
+            edgem = f[self.cinfo_path + "/edgemasks"][mask, ...]
+        return edgem
+
+    def _edgem_where(self, cell_id, trap_id):
+        id_mask = self._get_idx(cell_id, trap_id)
+        edgem = self._edgem_from_masking(id_mask)
+
+        return edgem
+
+    def outline(self, cell_id, trap_id):
+        id_mask = self._get_idx(cell_id, trap_id)
+        times = self["timepoint"][id_mask]
+
+        return times, self.edgem_from_masking(id_mask)
+
+    def at_time(self, timepoint, kind="mask"):
+        ix = self["timepoint"] == timepoint
+        traps = self["trap"][ix]
+        edgemasks = self._edgem_from_masking(ix)
+        masks = [
+            self._astype(edgemask, kind) for edgemask in edgemasks if edgemask.any()
+        ]
+        return self.group_by_traps(traps, masks)
+
+
 class CellsMat(Cells):
     def __init__(self, mat_object):
         super(CellsMat, self).__init__()