Attaches the relevant cross-sections to each axis.

        Parameters
        ----------

        attach_image : ndarray
            The image to be attached to the collage, once it is created.
            Must be atleast 3d.

        sampler : str or list or callable
            selection strategy: to identify the type of sampling done to select the slices to return.
            All sampling is done between the first and last non-empty slice in that view/dimension.

            - if 'linear' : linearly spaced slices
            - if list, it is treated as set of percentages at which slices to be sampled
                (must be in the range of [1-100], not [0-1]).
                This could be used to more/all slices in the middle e.g. range(40, 60, 5)
                    or at the end e.g. [ 5, 10, 15, 85, 90, 95]
            - if callable, it must take a 2D image of arbitray size, return True/False
                to indicate whether to select that slice or not.
                Only non-empty slices (atleas one non-zero voxel) are provided as input.
                Simple examples for callable could be based on
                1) percentage of non-zero voxels > x etc
                2) presence of desired texture ?
                3) certain properties of distribution (skewe: dark/bright, energy etc) etc

                If the sampler returns more than requested `num_slices`,
                    only the first num_slices will be selected.

        show : bool
            Flag to request immediate display of collage

def attach(self,
               image_in,
               sampler=None,
               show=True):
        """Attaches the relevant cross-sections to each axis.

        Parameters
        ----------

        attach_image : ndarray
            The image to be attached to the collage, once it is created.
            Must be atleast 3d.

        sampler : str or list or callable
            selection strategy: to identify the type of sampling done to select the slices to return.
            All sampling is done between the first and last non-empty slice in that view/dimension.

            - if 'linear' : linearly spaced slices
            - if list, it is treated as set of percentages at which slices to be sampled
                (must be in the range of [1-100], not [0-1]).
                This could be used to more/all slices in the middle e.g. range(40, 60, 5)
                    or at the end e.g. [ 5, 10, 15, 85, 90, 95]
            - if callable, it must take a 2D image of arbitray size, return True/False
                to indicate whether to select that slice or not.
                Only non-empty slices (atleas one non-zero voxel) are provided as input.
                Simple examples for callable could be based on
                1) percentage of non-zero voxels > x etc
                2) presence of desired texture ?
                3) certain properties of distribution (skewe: dark/bright, energy etc) etc

                If the sampler returns more than requested `num_slices`,
                    only the first num_slices will be selected.

        show : bool
            Flag to request immediate display of collage

        """

        if len(image_in.shape) < 3:
            raise ValueError('Image must be atleast 3D')

        # allowing the choice of new sampling for different invocations.
        if sampler is None:
            temp_sampler = self.sampler
        else:
            temp_sampler = sampler

        slicer = SlicePicker(image_in=image_in,
                             view_set=self.view_set,
                             num_slices=self.num_slices,
                             sampler=temp_sampler)

        try:
            for img_obj, slice_data in zip(self.images, slicer.get_slices()):
                img_obj.set_data(slice_data)
        except:
            self._data_attached = False
            raise ValueError('unable to attach the given image data to current collage')
        else:
            self._data_attached = True

        # show all the axes
        if show:
            self.show()