Ejemplo n.º 1
0
def compare_volumes_boundingbox(vol1, vol2, voxelsize_mm):
    import qmisc
    crinfo = qmisc.crinfo_from_specific_data(vol1, [20, 20, 20])
    vol1[
        crinfo[0][0]:crinfo[0][1],
        crinfo[1][0]:crinfo[1][1],
        crinfo[2][0]:crinfo[2][1]
    ]=1

    volume1 = np.sum(vol1 > 0)
    volume2 = np.sum(vol2 > 0)
    volume1_mm3 = volume1 * np.prod(voxelsize_mm)
    volume2_mm3 = volume2 * np.prod(voxelsize_mm)
    volume_avg_mm3 = (volume1_mm3 + volume2_mm3) * 0.5

    df = vol1 - vol2
    df1 = np.sum(df == 1) * np.prod(voxelsize_mm)
    df2 = np.sum(df == -1) * np.prod(voxelsize_mm)

    evaluation = {
        'box_err1_mm3': df1,
        'box_err2_mm3': df2,
        'box_err1_percent': df1 / volume_avg_mm3 * 100,
        'box_err2_percent': df2 / volume_avg_mm3 * 100,
    }
    return evaluation
Ejemplo n.º 2
0
def distance_matrics(vol1, vol2, voxelsize_mm):
    # crop data to reduce comutation time
    crinfo = qmisc.crinfo_from_specific_data(vol1, CROP_MARGIN)
    logger.debug(str(crinfo) + ' m1 ' + str(np.max(vol1)) +
                 ' m2 ' + str(np.min(vol2)))
    logger.debug("crinfo " + str(crinfo))
    vol1 = qmisc.crop(vol1, crinfo)
    vol2 = qmisc.crop(vol2, crinfo)

    border1 = get_border(vol1)
    border2 = get_border(vol2)

    #pyed = py3DSeedEditor.py3DSeedEditor(vol1, contour=vol1)
    #pyed.show()
    b1dst = scipy.ndimage.morphology.distance_transform_edt(
        1 - border1,
        sampling=voxelsize_mm
    )

    dst_b1_to_b2 = border2 * b1dst
    #import ipdb; ipdb.set_trace() # BREAKPOINT
    #pyed = py3DSeedEditor.py3DSeedEditor(dst_b1_to_b2, contour=vol1)
    #pyed.show()
    #print np.nonzero(border1)
    # avgd = np.average(dst_b1_to_b2[np.nonzero(border2)])
    avgd = np.average(dst_b1_to_b2[border2])
    rmsd = np.average(dst_b1_to_b2[border2] ** 2)
    maxd = np.max(dst_b1_to_b2)

    return avgd, rmsd, maxd
Ejemplo n.º 3
0
def compare_volumes_boundingbox(vol1, vol2, voxelsize_mm):
    import qmisc

    crinfo = qmisc.crinfo_from_specific_data(vol1, [20, 20, 20])
    vol1[
    crinfo[0][0]:crinfo[0][1],
    crinfo[1][0]:crinfo[1][1],
    crinfo[2][0]:crinfo[2][1]
    ] = 1

    volume1 = np.sum(vol1 > 0)
    volume2 = np.sum(vol2 > 0)
    volume1_mm3 = volume1 * np.prod(voxelsize_mm)
    volume2_mm3 = volume2 * np.prod(voxelsize_mm)
    volume_avg_mm3 = (volume1_mm3 + volume2_mm3) * 0.5

    df = vol1 - vol2
    df1 = np.sum(df == 1) * np.prod(voxelsize_mm)
    df2 = np.sum(df == -1) * np.prod(voxelsize_mm)

    evaluation = {
        'box_err1_mm3': df1,
        'box_err2_mm3': df2,
        'box_err1_percent': df1 / volume_avg_mm3 * 100,
        'box_err2_percent': df2 / volume_avg_mm3 * 100,
    }
    return evaluation
Ejemplo n.º 4
0
def distance_matrics(vol1, vol2, voxelsize_mm):
    # crop data to reduce comutation time
    crinfo = qmisc.crinfo_from_specific_data(vol1 + vol2, CROP_MARGIN)
    logger.debug(str(crinfo) + ' m1 ' + str(np.max(vol1)) +
                 ' m2 ' + str(np.min(vol2)))
    logger.debug("crinfo " + str(crinfo))
    vol1 = qmisc.crop(vol1, crinfo)
    vol2 = qmisc.crop(vol2, crinfo)

    border1 = get_border(vol1)
    border2 = get_border(vol2)

    # pyed = sed3.sed3(vol1, contour=vol1)
    # pyed.show()
    b1dst = scipy.ndimage.morphology.distance_transform_edt(
        1 - border1,
        sampling=voxelsize_mm
    )
    b2dst = scipy.ndimage.morphology.distance_transform_edt(
        1 - border2,
        sampling=voxelsize_mm
    )

    dst_b1_to_b2 = border2 * b1dst
    dst_b2_to_b1 = border1 * b2dst
    dst_12 = dst_b1_to_b2[border2]
    dst_21 = dst_b2_to_b1[border1]
    dst_both = np.append(dst_12, dst_21)

    # sum_d12 = np.sum(dst_12)
    # sum_d21 = np.sum(dst_21)
    # len_d12 = len(dst_12)
    # len_d21 = len(dst_21)
    # import ipdb; ipdb.set_trace() # BREAKPOINT
    # pyed = sed3.sed3(dst_b1_to_b2, contour=vol1)
    # pyed.show()
    # print np.nonzero(border1)
    # avgd = np.average(dst_b1_to_b2[np.nonzero(border2)])
    # import ipdb; ipdb.set_trace() #  noqa BREAKPOINT
    # avgd = (sum_d21 + sum_d12)/float(len_d21 + len_d12)
    # rmsd = ((np.sum(dst_12**2) + dst_21**2)/float(len_d21 + len_d12))**0.5
    avgd = np.average(dst_both)

# there is not clear what is correct
    # rmsd = np.average(dst_both ** 2)**0.5
    # rmsd = (np.average(dst_12) + np.average(dst_21))**0.5
    rmsd = np.average(dst_both ** 2)
    # rmsd = np.average(dst_b1_to_b2[border2] ** 2)
    maxd = max(np.max(dst_b1_to_b2), np.max(dst_b2_to_b1))
# old
    # avgd = np.average(dst_b1_to_b2[border2])
    # rmsd = np.average(dst_b1_to_b2[border2] ** 2)
    # maxd = np.max(dst_b1_to_b2)

    return avgd, rmsd, maxd
Ejemplo n.º 5
0
def distance_matrics(vol1, vol2, voxelsize_mm):
    # crop data to reduce comutation time
    crinfo = qmisc.crinfo_from_specific_data(vol1 + vol2, CROP_MARGIN)
    logger.debug(str(crinfo) + ' m1 ' + str(np.max(vol1)) +
                 ' m2 ' + str(np.min(vol2)))
    logger.debug("crinfo " + str(crinfo))
    vol1 = qmisc.crop(vol1, crinfo)
    vol2 = qmisc.crop(vol2, crinfo)

    border1 = _get_border(vol1)
    border2 = _get_border(vol2)

    # pyed = sed3.sed3(vol1, contour=vol1)
    # pyed.show()
    b1dst = scipy.ndimage.morphology.distance_transform_edt(
        1 - border1,
        sampling=voxelsize_mm
    )
    b2dst = scipy.ndimage.morphology.distance_transform_edt(
        1 - border2,
        sampling=voxelsize_mm
    )

    dst_b1_to_b2 = border2 * b1dst
    dst_b2_to_b1 = border1 * b2dst
    dst_12 = dst_b1_to_b2[border2]
    dst_21 = dst_b2_to_b1[border1]
    dst_both = np.append(dst_12, dst_21)

    # sum_d12 = np.sum(dst_12)
    # sum_d21 = np.sum(dst_21)
    # len_d12 = len(dst_12)
    # len_d21 = len(dst_21)
    # import ipdb; ipdb.set_trace() # BREAKPOINT
    # pyed = sed3.sed3(dst_b1_to_b2, contour=vol1)
    # pyed.show()
    # print np.nonzero(border1)
    # avgd = np.average(dst_b1_to_b2[np.nonzero(border2)])
    # import ipdb; ipdb.set_trace() #  noqa BREAKPOINT
    # avgd = (sum_d21 + sum_d12)/float(len_d21 + len_d12)
    # rmsd = ((np.sum(dst_12**2) + dst_21**2)/float(len_d21 + len_d12))**0.5
    avgd = np.average(dst_both)

    # there is not clear what is correct
    # rmsd = np.average(dst_both ** 2)**0.5
    # rmsd = (np.average(dst_12) + np.average(dst_21))**0.5
    rmsd = np.average(dst_both ** 2)
    # rmsd = np.average(dst_b1_to_b2[border2] ** 2)
    maxd = max(np.max(dst_b1_to_b2), np.max(dst_b2_to_b1))
    # old
    # avgd = np.average(dst_b1_to_b2[border2])
    # rmsd = np.average(dst_b1_to_b2[border2] ** 2)
    # maxd = np.max(dst_b1_to_b2)

    return avgd, rmsd, maxd
Ejemplo n.º 6
0
    def train_one(self, data,voxelSize_mm):
        """
        Trenovani shape modelu
        data se vezmou a oriznou (jen jatra)
        na oriznuta data je aplikovo binarni otevreni - rychlejsi nez morphsnakes
        co vznikne je uhlazena cast ktera se odecte od puvodniho obrazu
        cimz vzniknou spicky
        orezany obraz se nasledne rozparceluje podle velikosti (shape) modelu
        pokud pocet voxelu v danem useku prekroci danou mez, je modelu 
        prirazena nejaka hodnota. Meze jsou nasledujici:
        0%-50% => 1
        50%-75% => 2
        75%-100% => 3
        """
        
        crinfo = qmisc.crinfo_from_specific_data(data, margin=self.model_margin)
        datacr = qmisc.crop(data, crinfo=crinfo)
        dataShape = self.model.shape
        datacrres = self.trainThresholdMap(datacr, voxelSize_mm, dataShape)

        self.model += datacrres

        self.data_number += 1
Ejemplo n.º 7
0
    def train_one(self, data,voxelSize_mm):
        """
        Trenovani shape modelu
        data se vezmou a oriznou (jen jatra)
        na oriznuta data je aplikovo binarni otevreni - rychlejsi nez morphsnakes
        co vznikne je uhlazena cast ktera se odecte od puvodniho obrazu
        cimz vzniknou spicky
        orezany obraz se nasledne rozparceluje podle velikosti (shape) modelu
        pokud pocet voxelu v danem useku prekroci danou mez, je modelu 
        prirazena nejaka hodnota. Meze jsou nasledujici:
        0%-50% => 1
        50%-75% => 2
        75%-100% => 3
        """
        
        crinfo = qmisc.crinfo_from_specific_data(data, margin=self.model_margin)
        datacr = qmisc.crop(data, crinfo=crinfo)
        dataShape = self.model.shape
        datacrres = self.trainThresholdMap(datacr, voxelSize_mm, dataShape)

        self.model += datacrres

        self.data_number += 1
Ejemplo n.º 8
0
    def _crinfo_from_specific_data(self, data, margin):
# hledáme automatický ořez, nonzero dá indexy
        return qmisc.crinfo_from_specific_data(data, margin)
Ejemplo n.º 9
0
    def _interactivity_end(self, igc):
        """
        This is called after processing step. All data are rescaled to original
        resolution.
        """
        logger.debug('_interactivity_end()')

        self.__resize_to_orig(igc.seeds)
        self.organ_interactivity_counter = igc.interactivity_counter
        logger.debug("org inter counter " +
                     str(self.organ_interactivity_counter))
        logger.debug('nonzero segm ' + str(np.nonzero(self.segmentation)))
        # if False:
        if False:
            # TODO dodělat postprocessing PV
            import segmentation
            outputSegmentation = segmentation.vesselSegmentation(  # noqa
                self.data3d,
                self.segmentation,
                threshold=-1,
                inputSigma=0.15,
                dilationIterations=10,
                nObj=1,
                biggestObjects=False,
                seeds=(self.segmentation > 0).astype(np.int8),
                useSeedsOfCompactObjects=True,
                interactivity=True,
                binaryClosingIterations=2,
                binaryOpeningIterations=0)

        self._segmentation_postprocessing()

        # rint 'autocrop', self.autocrop
        if self.autocrop is True:
            # rint
            # mport pdb; pdb.set_trace()

            tmpcrinfo = qmisc.crinfo_from_specific_data(
                self.segmentation,
                self.autocrop_margin)

            self.crop(tmpcrinfo)

        if self.texture_analysis not in (None, False):
            import texture_analysis
            # doplnit nějaký kód, parametry atd
            # elf.orig_scale_segmentation =
            # texture_analysis.segmentation(self.data3d,
            # self.orig_scale_segmentation, params = self.texture_analysis)
            self.segmentation = texture_analysis.segmentation(
                self.data3d,
                self.segmentation,
                self.voxelsize_mm
            )

        # set label number
# !! pomaly!!!
# @TODO make faster
        self.segmentation[self.segmentation == 1] = self.output_label
#
        logger.debug('self.slab')
        logger.debug(str(self.slab))
        self.processing_time = (
            datetime.datetime.now() - self.time_start).total_seconds()

        logger.debug('processing_time = ' + str(self.processing_time))
Ejemplo n.º 10
0
    def _interactivity_end(self, igc):
        logger.debug('_interactivity_end()')
        # @TODO remove old code in except part
        try:
            # rint 'pred vyjimkou'
            # aise Exception ('test without skimage')
            # rint 'za vyjimkou'
            import skimage
            import skimage.transform
# Now we need reshape  seeds and segmentation to original size

            segm_orig_scale = skimage.transform.resize(
                self.segmentation, self.data3d.shape, order=0)

            seeds = skimage.transform.resize(
                igc.seeds, self.data3d.shape, order=0)

            self.segmentation = segm_orig_scale
            self.seeds = seeds
        except:

            segm_orig_scale = scipy.ndimage.zoom(
                self.segmentation,
                1.0 / self.zoom,
                mode='nearest',
                order=0
            ).astype(np.int8)
            seeds = scipy.ndimage.zoom(
                igc.seeds,
                1.0 / self.zoom,
                mode='nearest',
                order=0
            )
            self.organ_interactivity_counter = igc.interactivity_counter
            logger.debug("org inter counter " +
                         str(self.organ_interactivity_counter))

# @TODO odstranit hack pro oříznutí na stejnou velikost
# v podstatě je to vyřešeno, ale nechalo by se to dělat elegantněji v zoom
# tam je bohužel patrně bug
            # rint 'd3d ', self.data3d.shape
            # rint 's orig scale shape ', segm_orig_scale.shape
            shp = [
                np.min([segm_orig_scale.shape[0], self.data3d.shape[0]]),
                np.min([segm_orig_scale.shape[1], self.data3d.shape[1]]),
                np.min([segm_orig_scale.shape[2], self.data3d.shape[2]]),
            ]
            # elf.data3d = self.data3d[0:shp[0], 0:shp[1], 0:shp[2]]
            # mport ipdb; ipdb.set_trace() # BREAKPOINT

            self.segmentation = np.zeros(self.data3d.shape, dtype=np.int8)
            self.segmentation[
                0:shp[0],
                0:shp[1],
                0:shp[2]] = segm_orig_scale[0:shp[0], 0:shp[1], 0:shp[2]]

            del segm_orig_scale

            self.seeds[
                0:shp[0],
                0:shp[1],
                0:shp[2]] = seeds[0:shp[0], 0:shp[1], 0:shp[2]]

        if self.segmentation_smoothing:
            self.segm_smoothing(self.smoothing_mm)

        # rint 'autocrop', self.autocrop
        if self.autocrop is True:
            # rint
            # mport pdb; pdb.set_trace()

            tmpcrinfo = qmisc.crinfo_from_specific_data(
                self.segmentation,
                self.autocrop_margin)

            self.crop(tmpcrinfo)

        # seg = self
        # rint 'ms d3d ', oseg.data3d.shape
        # rint 'ms seg ', oseg.segmentation.shape
        # rint 'crinfo ', oseg.crinfo
            # elf.segmentation = qmisc.crop(self.segmentation, tmpcrinfo)
            # elf.data3d = qmisc.crop(self.data3d, tmpcrinfo)

            # elf.crinfo = qmisc.combinecrinfo(self.crinfo, tmpcrinfo)

        if self.texture_analysis not in (None, False):
            import texture_analysis
            # doplnit nějaký kód, parametry atd
            # elf.orig_scale_segmentation =
            # texture_analysis.segmentation(self.data3d,
            # self.orig_scale_segmentation, params = self.texture_analysis)
            self.segmentation = texture_analysis.segmentation(
                self.data3d,
                self.segmentation,
                self.voxelsize_mm
            )

        # set label number
# !! pomaly!!!
# @TODO make faster
        self.segmentation[self.segmentation == 1] = self.output_label
#
        self.processing_time = time.time() - self.time_start
Ejemplo n.º 11
0
def resection_portal_vein_new(data,
                              interactivity=False,
                              seeds=None,
                              label=10,
                              vein=6,
                              **kwargs):
    """
    New function for portal vein segmentation
    :param data:
    :param interactivity:
    :param seeds:
    :param kwargs:
    :return:
    """
    # ed = sed3.sed3(a)
    # ed.show()

    # from PyQt4 import QtGui
    # from PyQt4.QtGui import QApplication, QMainWindow, QVBoxLayout, QHBoxLayout, QLabel, QPushButton, QFrame, \
    # QFont, QPixmap, QFileDialog
    #
    # window = QtGui.QWidget()
    # mainLayout = QVBoxLayout()
    # window.setLayout(mainLayout)
    # mainLayout.addWidget(sed3.sed3qtWidget(data['data3d'], contour=data['segmentation']))

    # zachovani puvodnich dat
    segmentation = data["segmentation"]
    data3d = data["data3d"]

    # data pouze se segmentacemi
    segm = ((data["segmentation"] == label) * label +
            (data["segmentation"] == vein) * vein)

    # ufiknutí segmentace
    crinfo = qmisc.crinfo_from_specific_data(segm, [0])
    data["segmentation"] = qmisc.crop(segm, crinfo)
    data["data3d"] = qmisc.crop(data3d, crinfo)

    # @TODO zde nahradit střeve čímkoliv smysluplnějším
    if interactivity:
        print("Select cut")
        # seeds = cut_editor_old(data)
        seeds = cut_editor_old(data)
    elif seeds is None:
        logger.error('seeds is None and interactivity is False')
        return None

    lab, cut = split_vessel(data, seeds)
    segm, dist1, dist2 = split_organ_by_two_vessels(data, lab)

    # jatra rozdeleny na 3 kusy
    a = morphology.label(segm, background=0)
    ### podmínka nefunguje
    if 3 in a:  # zda se v segmentaci objevuje 3. cast
        print "slape :) :) :P"
        a_index = velikosti(segm)
        print a_index
        i = nejnizsi(a_index[0], a_index[1], a_index[2])
        segm = ((a == i) * (segm == 1).astype('int8') + (a != i) *
                (segm == 2).astype('int8') + (segm != 0).astype('int8'))

    # TODO split this function from visualization
    data = virtual_resection_visualization(data,
                                           segm,
                                           dist1,
                                           dist2,
                                           cut,
                                           interactivity=interactivity)

    # vrácení původních dat a spojení s upravenými daty
    data["data3d"] = data3d
    data["segmentation"] = qmisc.uncrop(
        data["segmentation"], crinfo,
        (len(segmentation), len(segmentation[0]), len(segmentation[0])))

    #segmentation = segmentation == vein
    data["segmentation"] = (
        data["segmentation"] +
        (segmentation != label) * segmentation) - (segmentation == vein) * vein
    return data