#
#------------------------------------------------------------------------------
# Copyright (c) 2013-2015, Christian Therien
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#------------------------------------------------------------------------------
#
# rois.py - This file is part of the PySptools package.
#
from __future__ import print_function
import numpy as np
[docs]class ROIs(object):
"""
Manage regions of interest (ROIs).
"""
def __init__(self, x, y):
"""
Support regions of interest.
Parameters:
x: `int`
The cube horizontal dimension (M.shape[0]).
y: `int`
The cube vertical dimension (M.shape[1]).
"""
self._rois = []
self._n_clusters = 0
# mask: a value of zero is X, and a value of 1,2... is y, 1 for the first
# roi, 2 for the next roi ...
self.mask = np.zeros((x, y), dtype=np.int)
[docs] def add(self, id, *rois):
"""
Add a named ROI.
Parameters:
id: `string`
The class (or cluster) name.
rois: `dictionary list`
Each parameter, a dictionary, represent a rectangle, a polygon or a raw array. They use matrix coordinates.
For a raw array: {'raw': mask-array}, mask-array is a binary 2D array with the hypercube (x,y) dimensions.
For a rectangle: {'rec': (upper_left_line, upper_left_column, lower_right_line, lower_right_column)}.
For a polygone: {'poly': ((l1,c1),(l2,c2), ...)}, **l** stand for line and **c** for column. The polygon don't need to be close.
You can define one or more raw, rectangle and/or polygon for a same cluster.
The polygon and the rectangle must be well formed.
"""
self._rois.append((id, rois))
self._n_clusters += 1
self._post_to_mask(rois, self._n_clusters)
def n_clusters(self):
return self._n_clusters
def get_mask(self):
return self.mask
[docs] def get_next(self):
"""
Iterator, return at each step: the cluster name and a ROI list.
Return: `tuple`
Cluster name, ROI list.
"""
for r in self._rois:
id_ = r[0]
rois = r[1]
yield id_, rois
[docs] def get_labels(self):
"""
Return a labels list.
Return: `list`
A labels list.
"""
labels = []
for r in self._rois:
labels.append(r[0])
return labels
def _post_to_mask(self, rois, id):
for r in rois:
if 'raw' in r:
bin_mask = r['raw']
for x in range(self.mask.shape[0]):
for y in range(self.mask.shape[1]):
if bin_mask[x,y] > 0:
self.mask[x,y] = id
if 'rec' in r:
x1,y1,x2,y2 = r['rec']
for x in range(self.mask.shape[0]):
for y in range(self.mask.shape[1]):
if (x >= x1 and x < x2) and (y >= y1 and y < y2):
self.mask[x,y] = id
if 'poly' in r:
import matplotlib.patches as patches
poly1 = patches.Polygon(r['poly'], closed=True)
for i in range(self.mask.shape[0]):
for j in range(self.mask.shape[1]):
if poly1.get_path().contains_point((i,j)) == True:
self.mask[i,j] = id
[docs] def plot(self, path, colorMap='Accent', suffix=None):
"""
Plot the ROIs.
Parameters:
path: `string`
The path where to put the plot.
colorMap: `string [default 'Accent']`
A color map element of
['Accent', 'Dark2', 'Paired', 'Pastel1', 'Pastel2', 'Set1', 'Set2', 'Set3'],
"Accent" is the default and it fall back on "Jet".
suffix: `string [default None]`
Add a suffix to the file name.
"""
from pysptools.classification import Output
plt = Output('ROIs')
plt.plot(self.mask, self._n_clusters, path=path, labels=self.get_labels(), colorMap=colorMap, firstBlack=True, suffix=suffix)
[docs] def display(self, colorMap='Accent', suffix=None):
"""
Display the ROIs.
Parameters:
colorMap: `string [default 'Accent']`
A color map element of
['Accent', 'Dark2', 'Paired', 'Pastel1', 'Pastel2', 'Set1', 'Set2', 'Set3'],
"Accent" is the default and it fall back on "Jet".
suffix: `string [default None]`
Add a suffix to the file name.
"""
from pysptools.classification import Output
plt = Output('ROIs')
plt.plot(self.mask, self._n_clusters, labels=self.get_labels(), colorMap=colorMap, firstBlack=True, suffix=suffix)
if __name__ == '__main__':
pass