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
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
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
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
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
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
def _crinfo_from_specific_data(self, data, margin): # hledáme automatický ořez, nonzero dá indexy return qmisc.crinfo_from_specific_data(data, margin)
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))
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
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