コード例 #1
0
    def process(self, dataset, i):
        print 'Register Data %s with mask...' % (self.ini.file.name_result[i])
        data, point, para = self.icp.register(dataset['fix'],
                                              dataset['mov'],
                                              1,
                                              useMask=True)
        resultData = db.ResultData(data,
                                   db.ImageInfo(dataset['fix'].info.data),
                                   point)
        resultData.info.addData('fix', 1)
        resultData.info.addData('move', 2)
        resultData.info.addData('transform', para)

        print 'Done!'
        mean_dis, mean_whole, max_dis, max_whole = self.surfaceerror.analysis(
            resultData, dataset['fix'].getPointSet('Contour').copy(),
            dataset['mov'].getPointSet('Contour').copy(),
            dataset['mov'].getPointSet('Mask').copy(),
            dataset['mov'].getResolution().tolist())
        print 'Contour Error Done! Whole mean is %0.2fmm.' % mean_whole

        for j in range(3):
            self.sheet.write(j + 1, i + 2, mean_dis[j])
        self.sheet.write(4, i + 2, mean_whole)
        self.book.save(self.path + self.ini.file.savedir + 'mask.xls')
        del data, point, resultData

        print 'Register Data %s without mask...' % (
            self.ini.file.name_result[i])
        data, point, para = self.icp.register(dataset['fix'], dataset['mov'],
                                              1)
        resultData = db.ResultData(data,
                                   db.ImageInfo(dataset['fix'].info.data),
                                   point)
        resultData.info.addData('fix', 1)
        resultData.info.addData('move', 2)
        resultData.info.addData('transform', para)

        print 'Done!'
        mean_dis, mean_whole, max_dis, max_whole = self.surfaceerror.analysis(
            resultData, dataset['fix'].getPointSet('Contour').copy(),
            dataset['mov'].getPointSet('Contour').copy(),
            dataset['mov'].getPointSet('Mask').copy(),
            dataset['mov'].getResolution().tolist())
        print 'Contour Error Done! Whole mean is %0.2fmm.' % mean_whole

        for j in range(3):
            self.sheet.write(j + 5, i + 2, mean_dis[j])
        self.sheet.write(8, i + 2, mean_whole)
        self.book.save(self.path + self.ini.file.savedir + 'mask.xls')
        del data, point, resultData
コード例 #2
0
 def process(self, dataset, k, i):
     self.sheet.write(0, k * 20 + i + 1, self.ini.file.name_result[i] + str(k))
     print 'Register Data %s...' % self.ini.file.name_result[i]
     if k == 0:
         data, point, para = self.icp.register(dataset['fix'], dataset['mov'], 1, op = True)
     elif k == 1:
         data, point, para = self.icp.register(dataset['fix'], dataset['mov'], 1)
     elif k == 2:
         data, point, para = self.icp.register(dataset['fix'], dataset['mov'], 0, op = True)
     else:
         data, point, para = self.icp.register(dataset['fix'], dataset['mov'], 0)
     resultData = db.ResultData(data, db.ImageInfo(dataset['fix'].info.data), point)
     resultData.info.addData('fix', 1)
     resultData.info.addData('move', 2)
     resultData.info.addData('transform', para)
     mean_dis, mean_whole, max_dis, max_whole = self.contourerror.analysis(resultData, dataset['fix'].getPointSet('Contour').copy())
     self.sheet.write(1, k * 20 + i + 1, mean_whole)
     mean_dis, mean_whole, max_dis, max_whole = self.contourareaerror.analysis(resultData, dataset['fix'].getPointSet('Contour').copy())
     self.sheet.write(2, k * 20 + i + 1, mean_whole)
     mean_dis, mean_whole, max_dis, max_whole = self.contourweigherror.analysis(resultData, dataset['fix'].getPointSet('Contour').copy())
     self.sheet.write(3, k * 20 + i + 1, mean_whole)
     mean_dis, mean_whole, max_dis, max_whole = self.contourweigherror.analysis(resultData, dataset['fix'].getPointSet('Contour').copy(), True)
     self.sheet.write(4, k * 20 + i + 1, mean_whole)
     print 'Contour Error Done! Whole mean is %0.2fmm.' % mean_whole
     
     self.book.save(self.path + self.ini.file.savedir + 'AllTest.xls')
     del data, point, resultData, para
コード例 #3
0
ファイル: TestIcpPara.py プロジェクト: guohengkai/MIRVAP
 def process(self, dataset, i):
     # ICP with centerline
     print 'Register Data %s with ICP(centerline)...' % self.ini.file.name_result[
         i]
     for sample in range(self.len):
         data, point, para = self.icp.register(dataset['fix'],
                                               dataset['mov'],
                                               0,
                                               MaxRate=self.para[sample],
                                               op=False)
         resultData = db.ResultData(data,
                                    db.ImageInfo(dataset['fix'].info.data),
                                    point)
         resultData.info.addData('fix', 1)
         resultData.info.addData('move', 2)
         resultData.info.addData('transform', para)
         print 'Downsample %d Done!' % (sample)
         mean_dis, mean_whole, max_dis, max_whole = self.surfaceerror.analysis(
             resultData, dataset['fix'].getPointSet('Contour').copy(),
             dataset['mov'].getPointSet('Contour').copy(),
             dataset['mov'].getPointSet('Mask').copy(),
             dataset['mov'].getResolution().tolist())
         print 'Contour Error Done! Whole mean is %0.2fmm.' % mean_whole
         self.error[sample, 0] += mean_whole
         self.error[sample, 1] += mean_whole**2
         del data, point, resultData
コード例 #4
0
    def process(self, dataset, i, k):
        print 'Register Data %s with ICP(centerline)...(Type %d)' % (
            self.ini.file.name_result[i], k)
        dataset['fix'].pointSet.data['Centerline'] = calCenterlineFromContour(
            dataset['fix'].pointSet.data, k, dataset['fix'].getData())
        dataset['mov'].pointSet.data['Centerline'] = calCenterlineFromContour(
            dataset['mov'].pointSet.data, k, dataset['mov'].getData())
        data, point, para = self.icp.register(dataset['fix'], dataset['mov'],
                                              1)
        resultData = db.ResultData(data,
                                   db.ImageInfo(dataset['fix'].info.data),
                                   point)
        resultData.info.addData('fix', 1)
        resultData.info.addData('move', 2)
        resultData.info.addData('transform', para)

        print 'Done!'
        mean_dis, mean_whole, max_dis, max_whole = self.surfaceerror.analysis(
            resultData, dataset['fix'].getPointSet('Contour').copy(),
            dataset['mov'].getPointSet('Contour').copy(),
            dataset['mov'].getPointSet('Mask').copy(),
            dataset['mov'].getResolution().tolist())
        print 'Contour Error Done! Whole mean is %0.2fmm.' % mean_whole

        for j in range(3):
            self.sheet.write(j + 1 + 4 * k, i + 2, float(mean_dis[j]))
        self.sheet.write(4 + 4 * k, i + 2, mean_whole)
        self.book.save('./Result/Center_merge.xls')
        del data, point, resultData
コード例 #5
0
    def loadDicomInfo(self, dir, dimension):
        # Only available for special data (Need to modify for more universal usage)
        info = db.ImageInfo()
        data = dicom.read_file(dir)
        modality = data.Modality
        info.addData('modality', modality)
        if modality == 'MR' or modality == 'CT':
            ps = data.PixelSpacing
            if modality == 'MR':
                z = data.SpacingBetweenSlices
            else:
                z = data.SliceThickness
            if dimension == 3:
                resolution = [float(z), float(ps[0]), float(ps[1])]
            else:
                resolution = [float(ps[0]), float(ps[1])]   
            resolution = npy.array(resolution)
            info.addData('resolution', resolution)
            orientation = npy.array(map(float, data.ImageOrientationPatient))
            info.addData('orientation', orientation)
        elif modality == 'US':
            r = data[0x200d, 0x3303].value
            resolution = npy.array([float(r[2]), float(r[1]), float(r[0])])
            info.addData('resolution', resolution)
            orientation = npy.array(map(float, data[0x200d, 0x3d00].value[0][0x0020, 0x9116].value[0][0x200d, 0x3d16].value))
            info.addData('orientation', orientation)
            
        # To make the orientation of images compatible
        view, flip = db.getViewAndFlipFromOrientation(orientation, resolution.shape[0])
        info.addData('view', view)
        info.addData('flip', flip)

        return info
コード例 #6
0
 def process(self, dataset, i):
     # ICP with centerline
     print 'Register Data %s with ICP(centerline)...' % self.ini.file.name_result[
         i]
     for sample in range(1, 11):
         if dataset['mov'].getResolution()[-1] < 0.2:
             times = 2
         else:
             times = 1
         data, point, para = self.icp.register(dataset['fix'],
                                               dataset['mov'], 1, False, 0,
                                               9999.0, sample * times)
         resultData = db.ResultData(data,
                                    db.ImageInfo(dataset['fix'].info.data),
                                    point)
         resultData.info.addData('fix', 1)
         resultData.info.addData('move', 2)
         resultData.info.addData('transform', para)
         print 'Downsample %d Done!' % (sample)
         mean_dis, mean_whole, max_dis, max_whole = self.surfaceerror.analysis(
             resultData, dataset['fix'].getPointSet('Contour').copy(),
             dataset['mov'].getPointSet('Contour').copy(),
             dataset['mov'].getPointSet('Mask').copy(),
             dataset['mov'].getResolution().tolist())
         print 'Contour Error Done! Whole mean is %0.2fmm.' % mean_whole
         self.error[sample - 1, :3] += mean_dis
         self.error[sample - 1, 3] += mean_whole
         del data, point, resultData
コード例 #7
0
ファイル: ClipPlugin.py プロジェクト: guohengkai/MIRVAP
    def KeyPressCallback(self, obj, event):
        ch = self.parent.window_interactor.GetKeySym()
        if ch == 'Return':
            if (self.X1, self.Y1) == (self.X2, self.Y2):
                return

            point = npy.round(self.getAllPoint())
            if self.parent.dimension:
                max = npy.max(point, axis=0)
                min = npy.min(point, axis=0)
                bound = [(min[i], max[i] + 1) for i in range(2)]
                bound = bound[::-1]
            else:
                point[0, self.parent.view] = 0
                point[1,
                      self.parent.view] = self.parent.parent.getData().getData(
                      ).shape[0] - 1
                max = npy.max(point, axis=0)
                min = npy.min(point, axis=0)
                bound = [(min[i], max[i] + 1) for i in range(3)]
                bound = bound[::-1]

            info = db.ImageInfo(self.parent.parent.getData().getInfo().data)
            info.setName(None)
            if not self.parent.dimension:
                orientation = npy.array([1, 0, 0, 0, 1, 0])
                info.addData('orientation', orientation)
                resolution = self.parent.parent.getData().getResolution()[::-1]
                info.addData('resolution', resolution)
                view, flip = db.getViewAndFlipFromOrientation(
                    orientation, resolution.shape[0])
                info.addData('view', view)
                info.addData('flip', flip)
                info.addData(
                    'clip',
                    npy.array([
                        bound[0][0], bound[0][1], bound[1][0], bound[1][1],
                        bound[2][0], bound[2][1]
                    ]))
                data = db.BasicData(
                    data=self.parent.parent.getData().getData()[
                        bound[0][0]:bound[0][1], bound[1][0]:bound[1][1],
                        bound[2][0]:bound[2][1]],
                    info=info)
            else:
                info.addData(
                    'clip',
                    npy.array(
                        [bound[0][0], bound[0][1], bound[1][0], bound[1][1]]))
                data = db.BasicData(
                    data=self.parent.parent.getData().getData()[
                        bound[0][0]:bound[0][1], bound[1][0]:bound[1][1]],
                    info=info)

            self.parent.parent.gui.addNewDataView(data)
コード例 #8
0
ファイル: TestWeightIcp.py プロジェクト: guohengkai/MIRVAP
 def process(self, dataset, i):
     # ICP with centerline
     print 'Register Data %s with ICP(centerline)...' % self.ini.file.name_result[i]
     for i in range(len(self.dis)):
         data, point, para = self.icp.register(dataset['fix'], dataset['mov'], 1, w_wrong = self.dis[i]) # CLICP
         #data, point, para = self.icp.register(dataset['fix'], dataset['mov'], 0, False, delta) #SICP
         resultData = db.ResultData(data, db.ImageInfo(dataset['fix'].info.data), point)
         resultData.info.addData('fix', 1)
         resultData.info.addData('move', 2)
         resultData.info.addData('transform', para)
         print 'Weight %f Done!' % self.dis[i]
         mean_dis, mean_whole, max_dis, max_whole = self.surfaceerror.analysis(resultData, dataset['fix'].getPointSet('Contour').copy(), dataset['mov'].getPointSet('Contour').copy(), dataset['mov'].getPointSet('Mask').copy(), dataset['mov'].getResolution().tolist())
         print 'Contour Error Done! Whole mean is %0.2fmm.' % mean_whole
         self.error[i] += mean_whole
         del data, point, resultData
コード例 #9
0
 def process(self, dataset, i):
     # ICP with centerline
     print 'Register Data %s with ICP(centerline)...' % self.ini.file.name_result[i]
     for i in self.dis:
         for j in self.dis:
             data, point, para = self.icp.register(dataset['fix'], dataset['mov'], 1, down_fix = i, down_mov = j, MaxRate = 1.0) # CLICP
             #data, point, para = self.icp.register(dataset['fix'], dataset['mov'], 0, False, delta) #SICP
             #data, point, para = self.icp.register(dataset['fix'], dataset['mov'], 1, False, delta, op = True) #CICP
             #data, point, para = self.icp.register(dataset['fix'], dataset['mov'], 0, False, delta, op = True) #SLICP
             resultData = db.ResultData(data, db.ImageInfo(dataset['fix'].info.data), point)
             resultData.info.addData('fix', 1)
             resultData.info.addData('move', 2)
             resultData.info.addData('transform', para)
             print 'Sample (%d, %d) Done!' % (i, j)
             mean_dis, mean_whole, max_dis, max_whole = self.surfaceerror.analysis(resultData, dataset['fix'].getPointSet('Contour').copy(), dataset['mov'].getPointSet('Contour').copy(), dataset['mov'].getPointSet('Mask').copy(), dataset['mov'].getResolution().tolist())
             print 'Contour Error Done! Whole mean is %0.2fmm.' % mean_whole
             self.error[i - 1, j - 1] += mean_whole
             del data, point, resultData
コード例 #10
0
 def run(self, *args, **kwargs):
     indexes = self.gui.getRegisterDataIndex()
     if indexes:
         if len(indexes) == 2:
             data, point, para = self.register(
                 self.gui.dataModel[indexes[0]],
                 self.gui.dataModel[indexes[1]])
             if data is None:
                 return
             resultData = db.ResultData(
                 data,
                 db.ImageInfo(self.gui.dataModel[indexes[0]].info.data),
                 point)
             resultData.addDetail('fix', indexes[0])
             resultData.addDetail('move', indexes[1])
             resultData.addDetail('transform', para)
             resultData.setName(None)
             return resultData
コード例 #11
0
    def process(self, dataset, i):
        '''
        mean_dis, mean_whole, max_dis, max_whole = self.contourerror.analysis(dataset['seg'], dataset['fix'].getPointSet('Contour').copy())
        print 'Segmentation Contour Error Done! Whole mean is %0.2fmm.' % mean_whole
        self.sheet1.write(0, i + 2, self.ini.file.name_result[i])
        for j in range(3):
            self.sheet1.write(j + 1, i + 2, mean_dis[j])
        self.sheet1.write(4, i + 2, mean_whole)
        
        self.book.save(self.path + self.ini.file.savedir + 'Test_segmentation.xls')
        '''
        # ICP with centerline
        print 'Register Data %s with ICP(centerline)...' % self.ini.file.name_result[
            i]
        data, point, para = self.icp.register(dataset['seg'], dataset['mov'],
                                              1)
        resultData = db.ResultData(data,
                                   db.ImageInfo(dataset['fix'].info.data),
                                   point)
        resultData.info.addData('fix', 1)
        resultData.info.addData('move', 2)
        resultData.info.addData('transform', para)
        mean_dis, mean_whole, max_dis, max_whole = self.surfaceerror.analysis(
            resultData, dataset['fix'].getPointSet('Contour').copy(),
            dataset['mov'].getPointSet('Contour').copy(),
            dataset['mov'].getResolution().tolist())
        #mean_dis, mean_whole, max_dis, max_whole = self.contourerror.analysis(resultData, dataset['fix'].getPointSet('Contour').copy())
        print 'Contour Error Done! Whole mean is %0.2fmm.' % mean_whole
        #dice_index, dice_index_all = self.areaerror.analysis(resultData, dataset['fix'].getPointSet('Contour').copy())
        #print 'Area Error Done! Whole Dice index is %0.3f.' % dice_index_all

        self.sheet2.write(0, i + 2, self.ini.file.name_result[i])
        for j in range(3):
            self.sheet2.write(j + 1, i + 2, mean_dis[j])
            self.sheet2.write(j + 5, i + 2, max_dis[j])
            #self.sheet2.write(j + 9, i + 2, dice_index[j])

        self.sheet2.write(4, i + 2, mean_whole)
        self.sheet2.write(8, i + 2, max_whole)
        #self.sheet2.write(12, i + 2, dice_index_all)

        self.book.save(self.path + self.ini.file.savedir +
                       'Test_segmentation_surface.xls')
        del data, point, resultData
コード例 #12
0
ファイル: LoadPhantom.py プロジェクト: guohengkai/MIRVAP
    def getInfo(self, res=[1.0, 1.0, 1.0], ori=0):
        info = db.ImageInfo()
        info.addData('modality', 'MR')
        resolution = npy.array(res)
        info.addData('resolution', resolution)
        if ori == 0:  # z
            orientation = npy.array([1, 0, 0, 0, 1, 0])
        elif ori == 1:  # y
            orientation = npy.array([1, 0, 0, 0, 0, -1])
        elif ori == 2:  # x
            orientation = npy.array([0, 1, 0, 0, 0, -1])
        info.addData('orientation', orientation)

        view, flip = db.getViewAndFlipFromOrientation(orientation,
                                                      resolution.shape[0])
        info.addData('view', view)
        info.addData('flip', flip)

        return info
コード例 #13
0
 def process(self, dataset, i):
     # ICP with centerline
     print 'Register Data %s with ICP(centerline)...' % self.ini.file.name_result[
         i]
     for fov in range(7):
         data, point, para = self.icp.register(dataset['fix'],
                                               dataset['mov'], 1, False, 0,
                                               9999.0, 1, fov + 1)
         resultData = db.ResultData(data,
                                    db.ImageInfo(dataset['fix'].info.data),
                                    point)
         resultData.info.addData('fix', 1)
         resultData.info.addData('move', 2)
         resultData.info.addData('transform', para)
         print 'FOV %dmm Done!' % (fov + 1)
         mean_dis, mean_whole, max_dis, max_whole = self.contourerror.analysis(
             resultData, dataset['fix'].getPointSet('Contour').copy())
         print 'Contour Error Done! Whole mean is %0.2fmm.' % mean_whole
         self.error[fov, :3] += mean_dis
         self.error[fov, 3] += mean_whole
         del data, point, resultData
コード例 #14
0
 def process(self, dataset, i):
     print 'Register Data %s with ICP(centerline) with label...' % self.ini.file.name_result[
         i]
     data, point, para = self.icp.register(dataset['fix'], dataset['mov'],
                                           1)
     resultData = db.ResultData(data,
                                db.ImageInfo(dataset['fix'].info.data),
                                point)
     resultData.info.addData('fix', 1)
     resultData.info.addData('move', 2)
     resultData.info.addData('transform', para)
     print 'Done!'
     print 'Evaluation Data %s...' % self.ini.file.name_result[i]
     mean_dis, mean_whole, max_dis, max_whole, result = self.contourerror.analysis(
         resultData, dataset['fix'].getPointSet('Contour').copy(), True)
     print 'Contour Error Done! Whole mean is %0.2fmm.' % mean_whole
     print result
     for cnt in range(3):
         for x in result[cnt].keys():
             self.result[cnt][x] = self.result[cnt].get(x,
                                                        0) + result[cnt][x]
             self.resultCnt[cnt][x] = self.resultCnt[cnt].get(x, 0) + 1
コード例 #15
0
    def process(self, dataset, i):
        def autoDetectContour(point, cnt, start, end, delta, res, type):
            self.new_points = npy.append(self.new_points, point, 0)
            points = point[:, :-2]
            d = 20
            count = 0
            for i in range(start + delta, end + delta, delta):
                center = calCentroidFromContour(points).reshape(2)
                image = dataset[type].getData()[i, :, :].transpose().copy()
                image = (image - npy.min(image)) / (npy.max(image) -
                                                    npy.min(image)) * 255
                down = npy.max([npy.ceil(center[0] - d / res[0]), 0])
                up = npy.min(
                    [npy.floor(center[0] + d / res[0]), image.shape[0]])
                left = npy.max([npy.ceil(center[1] - d / res[1]), 0])
                right = npy.min(
                    [npy.floor(center[1] + d / res[1]), image.shape[1]])
                crop_image = image[down:up, left:right]
                center -= [down, left]

                result = ac_segmentation(center, crop_image)

                a1 = ac_area(points.transpose(), image.shape)
                a2 = ac_area(result, crop_image.shape)
                rate = a2 * 1.0 / a1
                if rate >= min(1.5 + count * 0.2, 2.1) or rate <= 0.7:
                    temp_array = points.copy()
                    if cnt != 1 and rate > 0.7:
                        count += 1
                else:
                    temp_array = result.transpose().copy()
                    temp_array[:, :2] += [down, left]
                    count = 0
                points = temp_array.copy()

                temp_array = npy.insert(temp_array, 2, [[i], [cnt]], 1)
                self.new_points = npy.append(self.new_points, temp_array, 0)

                sys.stdout.write(str(i) + ',')
                sys.stdout.flush()
            print ' '

        # Segmentation of data
        print 'Segment Data %s...' % self.ini.file.name_result[i]
        tmp = dataset['fix'].pointSet.data['Contour']
        tmp = tmp[tmp[:, 0] >= 0]

        self.new_points = npy.array([[-1, -1, -1, -1]], dtype=npy.float32)
        bottom = int(npy.round(npy.min(tmp[:, 2])))
        bif = int(db.getBifurcation(tmp) + 0.5)
        up = int(npy.round(npy.max(tmp[:, 2])))
        bottom += (bif - bottom) / 2
        up -= (up - bif) / 2

        point_vital = [0] * 3
        point_vital[0] = tmp[(npy.round(tmp[:, -1]) == 0)
                             & (npy.round(tmp[:, 2]) == bottom)].copy()
        point_vital[1] = tmp[(npy.round(tmp[:, -1]) == 1)
                             & (npy.round(tmp[:, 2]) == up)].copy()
        point_vital[2] = tmp[(npy.round(tmp[:, -1]) == 2)
                             & (npy.round(tmp[:, 2]) == up)].copy()

        autoDetectContour(point_vital[0], 0, bottom, bif, 1,
                          dataset['fix'].getResolution().tolist(), 'fix')
        autoDetectContour(point_vital[1], 1, up, bif, -1,
                          dataset['fix'].getResolution().tolist(), 'fix')
        autoDetectContour(point_vital[2], 2, up, bif, -1,
                          dataset['fix'].getResolution().tolist(), 'fix')
        print ' '
        print 'Finish segmentation for fix data. '
        pointset = {'Contour': self.new_points}
        dataset['fix'].pointSet.data['Centerline'] = calCenterlineFromContour(
            pointset)
        self.new_points_fix = self.new_points.copy()
        # For mov data
        tmp = dataset['mov'].pointSet.data['Contour']
        tmp = tmp[tmp[:, 0] >= 0]

        self.new_points = npy.array([[-1, -1, -1, -1]], dtype=npy.float32)
        bottom = int(npy.round(npy.min(tmp[:, 2])))
        bif = int(db.getBifurcation(tmp) + 0.5)
        up = int(npy.round(npy.max(tmp[:, 2])))
        bottom += (bif - bottom) / 2
        up -= (up - bif) / 2

        point_vital = [0] * 3
        point_vital[0] = tmp[(npy.round(tmp[:, -1]) == 0)
                             & (npy.round(tmp[:, 2]) == bottom)].copy()
        point_vital[1] = tmp[(npy.round(tmp[:, -1]) == 1)
                             & (npy.round(tmp[:, 2]) == up)].copy()
        point_vital[2] = tmp[(npy.round(tmp[:, -1]) == 2)
                             & (npy.round(tmp[:, 2]) == up)].copy()

        autoDetectContour(point_vital[0], 0, bottom, bif, 1,
                          dataset['mov'].getResolution().tolist(), 'mov')
        autoDetectContour(point_vital[1], 1, up, bif, -1,
                          dataset['mov'].getResolution().tolist(), 'mov')
        autoDetectContour(point_vital[2], 2, up, bif, -1,
                          dataset['mov'].getResolution().tolist(), 'mov')
        print ' '
        print 'Finish segmentation for mov data. '
        pointset = {'Contour': self.new_points}
        dataset['mov'].pointSet.data['Centerline'] = calCenterlineFromContour(
            pointset)
        self.new_points_mov = self.new_points.copy()

        # ICP with centerline without label
        print 'Register Data %s with ICP(centerline) without label...' % self.ini.file.name_result[
            i]
        data, point, para = self.icp.register(dataset['fix'],
                                              dataset['mov'],
                                              1,
                                              op=True)
        resultData = db.ResultData(data,
                                   db.ImageInfo(dataset['fix'].info.data),
                                   point)
        resultData.info.addData('fix', 1)
        resultData.info.addData('move', 2)
        resultData.info.addData('transform', para)
        print 'Done!'
        mean_dis, mean_whole, max_dis, max_whole = self.surfaceerror.analysis(
            resultData, dataset['fix'].getPointSet('Contour').copy(),
            dataset['mov'].getPointSet('Contour').copy(),
            dataset['mov'].getPointSet('Mask').copy(),
            dataset['mov'].getResolution().tolist())
        print 'Contour Error Done! Whole mean is %0.2fmm.' % mean_whole
        dice_index, dice_index_all = self.areaerror.analysis(
            resultData, dataset['fix'].getPointSet('Contour').copy())
        print 'Area Error Done! Whole Dice index is %0.3f.' % dice_index_all

        self.sheet2.write(0, i + 2, self.ini.file.name_result[i])
        for j in range(3):
            self.sheet2.write(j + 1, i + 2, mean_dis[j])
            self.sheet2.write(j + 5, i + 2, max_dis[j])
            self.sheet2.write(j + 9, i + 2, dice_index[j])
        self.sheet2.write(4, i + 2, mean_whole)
        self.sheet2.write(8, i + 2, max_whole)
        self.sheet2.write(12, i + 2, dice_index_all)
        self.book.save(self.path + self.ini.file.savedir +
                       'multicontrast_seg_feature.xls')
        del data, point, resultData

        # ICP with centerline with label
        print 'Register Data %s with ICP(centerline) with label...' % self.ini.file.name_result[
            i]
        data, point, para = self.icp.register(dataset['fix'],
                                              dataset['mov'],
                                              1,
                                              op=False)
        resultData = db.ResultData(data,
                                   db.ImageInfo(dataset['fix'].info.data),
                                   point)
        resultData.info.addData('fix', 1)
        resultData.info.addData('move', 2)
        resultData.info.addData('transform', para)
        print 'Done!'
        mean_dis, mean_whole, max_dis, max_whole = self.surfaceerror.analysis(
            resultData, dataset['fix'].getPointSet('Contour').copy(),
            dataset['mov'].getPointSet('Contour').copy(),
            dataset['mov'].getPointSet('Mask').copy(),
            dataset['mov'].getResolution().tolist())
        print 'Contour Error Done! Whole mean is %0.2fmm.' % mean_whole
        dice_index, dice_index_all = self.areaerror.analysis(
            resultData, dataset['fix'].getPointSet('Contour').copy())
        print 'Area Error Done! Whole Dice index is %0.3f.' % dice_index_all

        self.sheet4.write(0, i + 2, self.ini.file.name_result[i])
        for j in range(3):
            self.sheet4.write(j + 1, i + 2, mean_dis[j])
            self.sheet4.write(j + 5, i + 2, max_dis[j])
            self.sheet4.write(j + 9, i + 2, dice_index[j])
        self.sheet4.write(4, i + 2, mean_whole)
        self.sheet4.write(8, i + 2, max_whole)
        self.sheet4.write(12, i + 2, dice_index_all)
        self.book.save(self.path + self.ini.file.savedir +
                       'multicontrast_seg_feature.xls')
        del data, point, resultData

        fix_points = dataset['fix'].getPointSet('Contour').copy()
        dataset['fix'].pointSet.data['Contour'] = self.new_points_fix
        mov_points = dataset['mov'].getPointSet('Contour').copy()
        dataset['mov'].pointSet.data['Contour'] = self.new_points_mov
        print 'Saving Data %s...' % self.ini.file.name_result[i]
        db.saveMatData(
            self.path + self.ini.file.savedir + self.ini.file.name_result[i] +
            '_snap.mat', [dataset['fix']], 0)
        db.saveMatData(
            self.path + self.ini.file.savedir + self.ini.file.name_result[i] +
            '_merge.mat', [dataset['mov']], 0)
        print 'Done!'

        # ICP with contour without label
        print 'Register Data %s with ICP(contour) without label...' % self.ini.file.name_result[
            i]
        data, point, para = self.icp.register(dataset['fix'],
                                              dataset['mov'],
                                              0,
                                              op=False)
        resultData = db.ResultData(data,
                                   db.ImageInfo(dataset['fix'].info.data),
                                   point)
        resultData.info.addData('fix', 1)
        resultData.info.addData('move', 2)
        resultData.info.addData('transform', para)
        print 'Done!'
        mean_dis, mean_whole, max_dis, max_whole = self.surfaceerror.analysis(
            resultData, fix_points.copy(), mov_points.copy(),
            dataset['mov'].getPointSet('Mask').copy(),
            dataset['mov'].getResolution().tolist())
        print 'Contour Error Done! Whole mean is %0.2fmm.' % mean_whole
        para = resultData.info.getData('transform')
        R = ml.mat(para[:9]).reshape(3, 3)
        T = ml.mat(para[9:12]).T
        T = R.I * T
        T = -T
        tmp_con, result_center_points = util.resliceTheResultPoints(
            mov_points, None, 20, dataset['mov'].getResolution().tolist(),
            dataset['fix'].getResolution().tolist(), False, R, T)
        resultData.pointSet.data['Contour'] = tmp_con
        dice_index, dice_index_all = self.areaerror.analysis(
            resultData, fix_points.copy())
        print 'Area Error Done! Whole Dice index is %0.3f.' % dice_index_all

        self.sheet1.write(0, i + 2, self.ini.file.name_result[i])
        for j in range(3):
            self.sheet1.write(j + 1, i + 2, mean_dis[j])
            self.sheet1.write(j + 5, i + 2, max_dis[j])
            self.sheet1.write(j + 9, i + 2, dice_index[j])
        self.sheet1.write(4, i + 2, mean_whole)
        self.sheet1.write(8, i + 2, max_whole)
        self.sheet1.write(12, i + 2, dice_index_all)
        self.book.save(self.path + self.ini.file.savedir +
                       'multicontrast_seg_feature.xls')
        del data, point, resultData

        # ICP with contour with label
        print 'Register Data %s with ICP(contour) with label...' % self.ini.file.name_result[
            i]
        data, point, para = self.icp.register(dataset['fix'],
                                              dataset['mov'],
                                              0,
                                              op=True)
        resultData = db.ResultData(data,
                                   db.ImageInfo(dataset['fix'].info.data),
                                   point)
        resultData.info.addData('fix', 1)
        resultData.info.addData('move', 2)
        resultData.info.addData('transform', para)
        print 'Done!'
        mean_dis, mean_whole, max_dis, max_whole = self.surfaceerror.analysis(
            resultData, fix_points.copy(), mov_points.copy(),
            dataset['mov'].getPointSet('Mask').copy(),
            dataset['mov'].getResolution().tolist())
        print 'Contour Error Done! Whole mean is %0.2fmm.' % mean_whole
        para = resultData.info.getData('transform')
        R = ml.mat(para[:9]).reshape(3, 3)
        T = ml.mat(para[9:12]).T
        T = R.I * T
        T = -T
        tmp_con, result_center_points = util.resliceTheResultPoints(
            mov_points, None, 20, dataset['mov'].getResolution().tolist(),
            dataset['fix'].getResolution().tolist(), False, R, T)
        resultData.pointSet.data['Contour'] = tmp_con
        dice_index, dice_index_all = self.areaerror.analysis(
            resultData, fix_points.copy())
        print 'Area Error Done! Whole Dice index is %0.3f.' % dice_index_all

        self.sheet3.write(0, i + 2, self.ini.file.name_result[i])
        for j in range(3):
            self.sheet3.write(j + 1, i + 2, mean_dis[j])
            self.sheet3.write(j + 5, i + 2, max_dis[j])
            self.sheet3.write(j + 9, i + 2, dice_index[j])
        self.sheet3.write(4, i + 2, mean_whole)
        self.sheet3.write(8, i + 2, max_whole)
        self.sheet3.write(12, i + 2, dice_index_all)
        self.book.save(self.path + self.ini.file.savedir +
                       'multicontrast_seg_feature.xls')
        del data, point, resultData

        del self.new_points, fix_points, self.new_points_fix, self.new_points_mov, mov_points, tmp_con, result_center_points
コード例 #16
0
    def process(self, dataset, i):
        def autoDetectContour(point, cnt, start, end, delta):
            self.new_points = npy.append(self.new_points, point, 0)
            points = point[:, :-2]
            count = 0
            for j in range(start + delta, end + delta, delta):
                center = calCentroidFromContour(points).reshape(2)
                image = dataset['fix'].getData()[j, :, :].transpose().copy()
                image = (image - npy.min(image)) / (npy.max(image) -
                                                    npy.min(image)) * 255
                result = ac_segmentation(center, image)

                a1 = ac_area(points.transpose(), image.shape)
                a2 = ac_area(result, image.shape)
                rate = a2 * 1.0 / a1
                if rate >= min(1.5 + count * 0.2, 2.1) or rate <= 0.7:
                    temp_array = points.copy()
                    if cnt != 1 and rate > 0.7:
                        count += 1
                else:
                    temp_array = result.transpose().copy()
                    count = 0
                points = temp_array.copy()
                temp_array = npy.insert(temp_array, 2, [[j], [cnt]], 1)
                self.new_points = npy.append(self.new_points, temp_array, 0)

                sys.stdout.write(str(j) + ',')
                sys.stdout.flush()
            print ' '

        print 'Segment Data %s...' % self.ini.file.name_result[i]
        tmp = dataset['fix'].pointSet.data['Contour']
        tmp = tmp[tmp[:, 0] >= 0]

        self.new_points = npy.array([[-1, -1, -1, -1]], dtype=npy.float32)
        time1 = time.time()
        bottom = int(npy.round(npy.min(tmp[:, 2])))
        bif = int(db.getBifurcation(tmp) + 0.5)
        up = int(npy.round(npy.max(tmp[:, 2])))

        point_vital = [0] * 3
        point_vital[0] = tmp[(npy.round(tmp[:, -1]) == 0)
                             & (npy.round(tmp[:, 2]) == bottom)].copy()
        point_vital[1] = tmp[(npy.round(tmp[:, -1]) == 1)
                             & (npy.round(tmp[:, 2]) == up)].copy()
        point_vital[2] = tmp[(npy.round(tmp[:, -1]) == 2)
                             & (npy.round(tmp[:, 2]) == up)].copy()

        autoDetectContour(point_vital[0], 0, bottom, bif, 1)
        autoDetectContour(point_vital[1], 1, up, bif, -1)
        autoDetectContour(point_vital[2], 2, up, bif, -1)
        time2 = time.time()
        '''
        # Use centerline for contour
        j = 0
        for center in tmp:
            image = dataset['fix'].getData()[npy.round(center[2]), :, :].transpose().copy()
            image = (image - npy.min(image)) / (npy.max(image) - npy.min(image)) * 255
            result = ac_segmentation(center[:2], image)
            
            point_array = npy.insert(result.transpose(), 2, [[center[2]],[center[3]]], axis = 1)
            new_points = npy.append(new_points, point_array, 0)
            
            j += 1
            if j % 10 == 0:
                sys.stdout.write(str(j) + ',')
                sys.stdout.flush()
        '''
        print ' '
        print 'Done! Time for segmentation is %0.2fs' % (time2 - time1)
        pointset = {'Contour': self.new_points}
        pointset['Centerline'] = calCenterlineFromContour(pointset)
        print 'Saving Data %s...' % self.ini.file.name_result[i]
        new_data = db.BasicData(dataset['fix'].data,
                                db.ImageInfo(dataset['fix'].info.data),
                                pointset)
        db.saveMatData(
            self.savepath + self.ini.file.name_result[i] + '_mr.mat',
            [new_data], 0)
        print 'Done!'
        mean_dis, mean_whole, max_dis, max_whole = self.contourerror.analysis(
            new_data, dataset['fix'].getPointSet('Contour').copy())
        print 'Contour Error Done! Whole mean is %0.2fmm.' % mean_whole
        self.sheet1.write(0, i + 2, self.ini.file.name_result[i])
        for j in range(3):
            self.sheet1.write(j + 1, i + 2, mean_dis[j])
        self.sheet1.write(4, i + 2, mean_whole)
        self.sheet1.write(5, i + 2, time2 - time1)

        self.book.save(self.path + self.ini.file.savedir +
                       'Test_segmentation_final_refined.xls')

        # ICP with centerline
        print 'Register Data %s with ICP(centerline)...' % self.ini.file.name_result[
            i]
        time1 = time.time()
        data, point, para = self.icp.register(new_data, dataset['mov'], 1)
        time2 = time.time()
        print 'Done! Time for registration is %0.2fs' % (time2 - time1)
        resultData = db.ResultData(data,
                                   db.ImageInfo(dataset['fix'].info.data),
                                   point)
        resultData.info.addData('fix', 1)
        resultData.info.addData('move', 2)
        resultData.info.addData('transform', para)
        mean_dis, mean_whole, max_dis, max_whole = self.contourerror.analysis(
            resultData, dataset['fix'].getPointSet('Contour').copy())
        print 'Contour Error Done! Whole mean is %0.2fmm.' % mean_whole
        dice_index, dice_index_all = self.areaerror.analysis(
            resultData, dataset['fix'].getPointSet('Contour').copy())
        print 'Area Error Done! Whole Dice index is %0.3f.' % dice_index_all

        self.sheet2.write(0, i + 2, self.ini.file.name_result[i])
        for j in range(3):
            self.sheet2.write(j + 1, i + 2, mean_dis[j])
            self.sheet2.write(j + 5, i + 2, max_dis[j])
            self.sheet2.write(j + 9, i + 2, dice_index[j])

        self.sheet2.write(4, i + 2, mean_whole)
        self.sheet2.write(8, i + 2, max_whole)
        self.sheet2.write(12, i + 2, dice_index_all)
        self.sheet2.write(13, i + 2, time2 - time1)

        self.book.save(self.path + self.ini.file.savedir +
                       'Test_segmentation_final_refined2.xls')
        del data, point, resultData
コード例 #17
0
    def process(self, dataset, i):
        # ICP with contour without label
        print 'Register Data %s with ICP(contour) without label...' % self.ini.file.name_result[
            i]
        data, point, para, time = self.icp.register(dataset['fix'],
                                                    dataset['mov'],
                                                    0,
                                                    op=False,
                                                    isTime=True)
        resultData = db.ResultData(data,
                                   db.ImageInfo(dataset['fix'].info.data),
                                   point)
        resultData.info.addData('fix', 1)
        resultData.info.addData('move', 2)
        resultData.info.addData('transform', para)
        print 'Done!'
        mean_dis, mean_whole, max_dis, max_whole = self.surfaceerror.analysis(
            resultData, dataset['fix'].getPointSet('Contour').copy(),
            dataset['mov'].getPointSet('Contour').copy(),
            dataset['mov'].getPointSet('Mask').copy(),
            dataset['mov'].getResolution().tolist())
        print 'Contour Error Done! Whole mean is %0.2fmm.' % mean_whole
        dice_index, dice_index_all = self.areaerror.analysis(
            resultData, dataset['fix'].getPointSet('Contour').copy())
        print 'Area Error Done! Whole Dice index is %0.3f.' % dice_index_all

        self.sheet1.write(0, i + 2, self.ini.file.name_result[i])
        for j in range(3):
            self.sheet1.write(j + 1, i + 2, mean_dis[j])
            self.sheet1.write(j + 5, i + 2, max_dis[j])
            self.sheet1.write(j + 9, i + 2, dice_index[j])
        self.sheet1.write(4, i + 2, mean_whole)
        self.sheet1.write(8, i + 2, max_whole)
        self.sheet1.write(12, i + 2, dice_index_all)
        self.sheet1.write(13, i + 2, time)
        self.book.save(self.path + self.ini.file.savedir + 'snap_feature.xls')
        del data, point, resultData

        # ICP with centerline without label
        print 'Register Data %s with ICP(centerline) without label...' % self.ini.file.name_result[
            i]
        data, point, para, time = self.icp.register(dataset['fix'],
                                                    dataset['mov'],
                                                    1,
                                                    op=True,
                                                    isTime=True)
        resultData = db.ResultData(data,
                                   db.ImageInfo(dataset['fix'].info.data),
                                   point)
        resultData.info.addData('fix', 1)
        resultData.info.addData('move', 2)
        resultData.info.addData('transform', para)
        print 'Done!'
        mean_dis, mean_whole, max_dis, max_whole = self.surfaceerror.analysis(
            resultData, dataset['fix'].getPointSet('Contour').copy(),
            dataset['mov'].getPointSet('Contour').copy(),
            dataset['mov'].getPointSet('Mask').copy(),
            dataset['mov'].getResolution().tolist())
        print 'Contour Error Done! Whole mean is %0.2fmm.' % mean_whole
        dice_index, dice_index_all = self.areaerror.analysis(
            resultData, dataset['fix'].getPointSet('Contour').copy())
        print 'Area Error Done! Whole Dice index is %0.3f.' % dice_index_all

        self.sheet2.write(0, i + 2, self.ini.file.name_result[i])
        for j in range(3):
            self.sheet2.write(j + 1, i + 2, mean_dis[j])
            self.sheet2.write(j + 5, i + 2, max_dis[j])
            self.sheet2.write(j + 9, i + 2, dice_index[j])
        self.sheet2.write(4, i + 2, mean_whole)
        self.sheet2.write(8, i + 2, max_whole)
        self.sheet2.write(12, i + 2, dice_index_all)
        self.sheet2.write(13, i + 2, time)
        self.book.save(self.path + self.ini.file.savedir + 'snap_feature.xls')
        del data, point, resultData

        # ICP with contour with label
        print 'Register Data %s with ICP(contour) with label...' % self.ini.file.name_result[
            i]
        data, point, para, time = self.icp.register(dataset['fix'],
                                                    dataset['mov'],
                                                    0,
                                                    op=True,
                                                    isTime=True)
        resultData = db.ResultData(data,
                                   db.ImageInfo(dataset['fix'].info.data),
                                   point)
        resultData.info.addData('fix', 1)
        resultData.info.addData('move', 2)
        resultData.info.addData('transform', para)
        print 'Done!'
        mean_dis, mean_whole, max_dis, max_whole = self.surfaceerror.analysis(
            resultData, dataset['fix'].getPointSet('Contour').copy(),
            dataset['mov'].getPointSet('Contour').copy(),
            dataset['mov'].getPointSet('Mask').copy(),
            dataset['mov'].getResolution().tolist())
        print 'Contour Error Done! Whole mean is %0.2fmm.' % mean_whole
        dice_index, dice_index_all = self.areaerror.analysis(
            resultData, dataset['fix'].getPointSet('Contour').copy())
        print 'Area Error Done! Whole Dice index is %0.3f.' % dice_index_all

        self.sheet3.write(0, i + 2, self.ini.file.name_result[i])
        for j in range(3):
            self.sheet3.write(j + 1, i + 2, mean_dis[j])
            self.sheet3.write(j + 5, i + 2, max_dis[j])
            self.sheet3.write(j + 9, i + 2, dice_index[j])
        self.sheet3.write(4, i + 2, mean_whole)
        self.sheet3.write(8, i + 2, max_whole)
        self.sheet3.write(12, i + 2, dice_index_all)
        self.sheet3.write(13, i + 2, time)
        self.book.save(self.path + self.ini.file.savedir + 'snap_feature.xls')
        del data, point, resultData

        # ICP with centerline with label
        print 'Register Data %s with ICP(centerline) with label...' % self.ini.file.name_result[
            i]
        data, point, para, time = self.icp.register(dataset['fix'],
                                                    dataset['mov'],
                                                    1,
                                                    op=False,
                                                    isTime=True)
        resultData = db.ResultData(data,
                                   db.ImageInfo(dataset['fix'].info.data),
                                   point)
        resultData.info.addData('fix', 1)
        resultData.info.addData('move', 2)
        resultData.info.addData('transform', para)
        print 'Done!'
        mean_dis, mean_whole, max_dis, max_whole = self.surfaceerror.analysis(
            resultData, dataset['fix'].getPointSet('Contour').copy(),
            dataset['mov'].getPointSet('Contour').copy(),
            dataset['mov'].getPointSet('Mask').copy(),
            dataset['mov'].getResolution().tolist())
        print 'Contour Error Done! Whole mean is %0.2fmm.' % mean_whole
        dice_index, dice_index_all = self.areaerror.analysis(
            resultData, dataset['fix'].getPointSet('Contour').copy())
        print 'Area Error Done! Whole Dice index is %0.3f.' % dice_index_all

        self.sheet4.write(0, i + 2, self.ini.file.name_result[i])
        for j in range(3):
            self.sheet4.write(j + 1, i + 2, mean_dis[j])
            self.sheet4.write(j + 5, i + 2, max_dis[j])
            self.sheet4.write(j + 9, i + 2, dice_index[j])
        self.sheet4.write(4, i + 2, mean_whole)
        self.sheet4.write(8, i + 2, max_whole)
        self.sheet4.write(12, i + 2, dice_index_all)
        self.sheet4.write(13, i + 2, time)
        self.book.save(self.path + self.ini.file.savedir + 'time_feature.xls')
        del data, point, resultData
コード例 #18
0
 def register(self, fixedData, movingData, index = -1, isRigid = False, isTime = False): # For simple test
     if index == -1:
         if self.gui is not None:
             index = self.gui.getDataIndex({'Contour': 0, 'Centerline': 1}, 'Select the object')
         else:
             index = 1
     if index is None:
         return None, None, None
     if index == 0:
         fixed_points = fixedData.getPointSet('Contour')
         moving_points = movingData.getPointSet('Contour')
     else:
         fixed_points = fixedData.getPointSet('Centerline')
         moving_points = movingData.getPointSet('Centerline')
     time1 = time.time()
     # Initial data
     fixed_res = fixedData.getResolution().tolist()
     moving_res = movingData.getResolution().tolist()
     
     fixed_points_con = fixedData.getPointSet('Contour')
     moving_points_con = movingData.getPointSet('Contour')
     fixed_points_cen = fixedData.getPointSet('Centerline')
     moving_points_cen = movingData.getPointSet('Centerline')
     
     fixed_points_ori = fixed_points.copy()[npy.where(fixed_points[:, 0] >= 0)]
     moving_points_ori = moving_points.copy()[npy.where(moving_points[:, 0] >= 0)]
     fixed_points_con_ori = fixed_points_con.copy()[npy.where(fixed_points_con[:, 0] >= 0)]
     moving_points_con_ori = moving_points_con.copy()[npy.where(moving_points_con[:, 0] >= 0)]
     fixed_points_cen_ori = fixed_points_cen.copy()[npy.where(fixed_points_cen[:, 0] >= 0)]
     moving_points_cen_ori = moving_points_cen.copy()[npy.where(moving_points_cen[:, 0] >= 0)]
     
     fixed_points = fixed_points_ori.copy()
     moving_points = moving_points_ori.copy()
     fixed_points_con = fixed_points_con_ori.copy()
     moving_points_con = moving_points_con_ori.copy()
     fixed_points_cen = fixed_points_cen_ori.copy()
     moving_points_cen = moving_points_cen_ori.copy()
     
     init_time = 0.0
     time1 = time.time()
     
     fix_img = fixedData.getData()
     mov_img = movingData.getData()
     
     # Calculate the initial rigid transformation for 9 points T0
     fix_key_point = eutil.getKeyPoints(fixed_points_cen, fixed_res)
     mov_key_point = eutil.getKeyPoints(moving_points_cen, moving_res)
     T0, mov_bif = eutil.getRigidTransform(fix_key_point, mov_key_point) # 4 * 4 Matrix
     moving_points = eutil.applyRigidTransformOnPoints(moving_points, moving_res, T0)
     moving_points_con = eutil.applyRigidTransformOnPoints(moving_points_con, moving_res, T0)
     moving_points_cen_result = eutil.applyRigidTransformOnPoints(moving_points_cen, moving_res, T0)
     crop_fixed_index, crop_moving_index = eutil.cropCenterline(fixed_points_cen, moving_points_cen_result, fixed_res, moving_res, fix_key_point[0, 2] / fixed_res[2], mov_bif[2] / moving_res[2])
     
     # Use GMMREG for centerline-based rigid registration T1
     gmm = GmmregPointsetRegistration(self.gui)
     new_fixedData = db.BasicData(fix_img, db.ImageInfo(fixedData.getInfo().data), 
         {'Contour': fixed_points_con, 'Centerline': fixed_points_cen[crop_fixed_index]})
     new_movingData = db.BasicData(mov_img, db.ImageInfo(movingData.getInfo().data), 
         {'Contour': moving_points_con, 'Centerline': moving_points_cen_result[crop_moving_index]})
     tmp_img, points, para = gmm.register(new_fixedData, new_movingData, index, False, "rigid")
     T1 = eutil.getMatrixFromGmmPara(para)
     T_init = T0 * T1
     moving_points = points['Contour'].copy()
     moving_points_cen_result = points['Centerline'].copy()
     del new_movingData
     
     # Use GMMREG for centerline-based TPS registration
     if not isRigid:
         new_movingData = db.BasicData(mov_img, db.ImageInfo(fixedData.getInfo().data), 
             {'Contour': moving_points, 'Centerline': moving_points_cen_result}) # The image has been resampled into fixed resolution
         tmp_img, points, para = gmm.register(new_fixedData, new_movingData, index, False, "EM_TPS")
     time2 = time.time()
     
     sa = SurfaceErrorAnalysis(None)
     dataset = db.BasicData(npy.array([[[0]]]), fixedData.getInfo(), points)
     mean_dis, mean_whole, max_dis, max_whole = sa.analysis(dataset, point_data_fix = fixed_points_con.copy(), useResult = True)
     del dataset
     print mean_dis
     print mean_whole
     
     if isTime:
         return tmp_img, points, [mean_dis, mean_whole], time2 - time1
     return tmp_img, points, [mean_dis, mean_whole]
コード例 #19
0
    def process(self, dataset, i):
        # ICP with centerline
        print 'Register Data %s with ICP...' % self.ini.file.name_result[i]
        tmp = dataset['mov'].pointSet.data['Contour'].copy()
        for sd in range(0, 16):
            mean_dis_all = npy.zeros([4, 3], dtype=npy.float32)
            mean_whole_all = npy.zeros([4, 1], dtype=npy.float32)
            if sd > 0:
                repeat = self.repeat
            else:
                repeat = 1
            for i in range(repeat):
                dataset['mov'].pointSet.data['Contour'] = AddNoise(
                    tmp,
                    float(sd) / 5)
                dataset['mov'].pointSet.data[
                    'Centerline'] = calCenterlineFromContour(
                        dataset['mov'].pointSet.data)

                # Centerline label
                data, point, para = self.icp.register(dataset['fix'],
                                                      dataset['mov'], 1)
                resultData = db.ResultData(
                    data, db.ImageInfo(dataset['fix'].info.data), point)
                resultData.info.addData('fix', 1)
                resultData.info.addData('move', 2)
                resultData.info.addData('transform', para)

                mean_dis, mean_whole, max_dis, max_whole = self.surfaceerror.analysis(
                    resultData, dataset['fix'].getPointSet('Contour').copy(),
                    dataset['mov'].getPointSet('Contour').copy(),
                    dataset['mov'].getPointSet('Mask').copy(),
                    dataset['mov'].getResolution().tolist())
                mean_dis_all[0, :] += mean_dis
                mean_whole_all[0] += mean_whole
                del data, point, resultData, para

                # Contour label
                data, point, para = self.icp.register(dataset['fix'],
                                                      dataset['mov'],
                                                      0,
                                                      op=True)
                resultData = db.ResultData(
                    data, db.ImageInfo(dataset['fix'].info.data), point)
                resultData.info.addData('fix', 1)
                resultData.info.addData('move', 2)
                resultData.info.addData('transform', para)

                mean_dis, mean_whole, max_dis, max_whole = self.surfaceerror.analysis(
                    resultData, dataset['fix'].getPointSet('Contour').copy(),
                    dataset['mov'].getPointSet('Contour').copy(),
                    dataset['mov'].getPointSet('Mask').copy(),
                    dataset['mov'].getResolution().tolist())
                mean_dis_all[1, :] += mean_dis
                mean_whole_all[1] += mean_whole
                del data, point, resultData, para

                # Centerline no-label
                data, point, para = self.icp.register(dataset['fix'],
                                                      dataset['mov'],
                                                      1,
                                                      op=True)
                resultData = db.ResultData(
                    data, db.ImageInfo(dataset['fix'].info.data), point)
                resultData.info.addData('fix', 1)
                resultData.info.addData('move', 2)
                resultData.info.addData('transform', para)

                mean_dis, mean_whole, max_dis, max_whole = self.surfaceerror.analysis(
                    resultData, dataset['fix'].getPointSet('Contour').copy(),
                    dataset['mov'].getPointSet('Contour').copy(),
                    dataset['mov'].getPointSet('Mask').copy(),
                    dataset['mov'].getResolution().tolist())
                mean_dis_all[2, :] += mean_dis
                mean_whole_all[2] += mean_whole
                del data, point, resultData, para

                # Contour no-label
                data, point, para = self.icp.register(dataset['fix'],
                                                      dataset['mov'], 0)
                resultData = db.ResultData(
                    data, db.ImageInfo(dataset['fix'].info.data), point)
                resultData.info.addData('fix', 1)
                resultData.info.addData('move', 2)
                resultData.info.addData('transform', para)

                mean_dis, mean_whole, max_dis, max_whole = self.surfaceerror.analysis(
                    resultData, dataset['fix'].getPointSet('Contour').copy(),
                    dataset['mov'].getPointSet('Contour').copy(),
                    dataset['mov'].getPointSet('Mask').copy(),
                    dataset['mov'].getResolution().tolist())
                mean_dis_all[3, :] += mean_dis
                mean_whole_all[3] += mean_whole
                del data, point, resultData, para

                sys.stdout.write(str(i) + ',')
                sys.stdout.flush()

            mean_dis_all /= repeat
            mean_whole_all /= repeat
            print ' '
            print 'Noise level %fmm Done!' % (float(sd) / 5)
            print 'Contour Error Done! Whole mean is %0.2fmm vs %0.2fmm.' % (
                mean_whole_all[0], mean_whole_all[1])
            for i in range(4):
                self.error[i, sd, :3] += mean_dis_all[i, :]
                self.error[i, sd, 3] += mean_whole_all[i]
コード例 #20
0
 def register(self, fixedData, movingData, regPara = [(40.0, 1000.0, "SSD")], w2 = 1.0, true_fixed_points = None, true_moving_points = None): # For simple test
     # Initial data
     fixed_res = fixedData.getResolution().tolist()
     moving_res = movingData.getResolution().tolist()
     
     fixed_points = fixedData.getPointSet('Contour')
     moving_points = movingData.getPointSet('Contour')
     fixed_points_cen = fixedData.getPointSet('Centerline')
     moving_points_cen = movingData.getPointSet('Centerline')
     
     fixed_points_ori = fixed_points.copy()[npy.where(fixed_points[:, 0] >= 0)]
     moving_points_ori = moving_points.copy()[npy.where(moving_points[:, 0] >= 0)]
     fixed_points_cen_ori = fixed_points_cen.copy()[npy.where(fixed_points_cen[:, 0] >= 0)]
     moving_points_cen_ori = moving_points_cen.copy()[npy.where(moving_points_cen[:, 0] >= 0)]
     
     if true_fixed_points is None:
         true_fixed_points = fixed_points_ori
     if true_moving_points is None:
         true_moving_points = moving_points_ori
     
     fixed_points = fixed_points_ori.copy()
     moving_points = moving_points_ori.copy()
     fixed_points_cen = fixed_points_cen_ori.copy()
     moving_points_cen = moving_points_cen_ori.copy()
     
     fix_img = fixedData.getData()
     mov_img = movingData.getData()
     
     init_time = 0.0
     time1 = time.time()
     # Calculate the initial rigid transformation for 9 points T0
     fix_key_point = eutil.getKeyPoints(fixed_points_cen, fixed_res)
     mov_key_point = eutil.getKeyPoints(moving_points_cen, moving_res)
     T0, mov_bif = eutil.getRigidTransform(fix_key_point, mov_key_point) # 4 * 4 Matrix
     moving_points = eutil.applyRigidTransformOnPoints(moving_points, moving_res, T0)
     moving_points_cen_result = eutil.applyRigidTransformOnPoints(moving_points_cen, moving_res, T0)
     crop_fixed_index, crop_moving_index = eutil.cropCenterline(fixed_points_cen, moving_points_cen_result, fixed_res, moving_res, fix_key_point[0, 2] / fixed_res[2], mov_bif[2] / moving_res[2])
     
     # Use GMMREG for centerline-based rigid registration T1
     gmm = GmmregPointsetRegistration(self.gui)
     new_fixedData = db.BasicData(fix_img, db.ImageInfo(fixedData.getInfo().data), 
         {'Contour': fixed_points, 'Centerline': fixed_points_cen[crop_fixed_index]})
     new_movingData = db.BasicData(mov_img, db.ImageInfo(movingData.getInfo().data), 
         {'Contour': moving_points, 'Centerline': moving_points_cen_result[crop_moving_index]})
     tmp_img, points, para = gmm.register(new_fixedData, new_movingData, 1, False, "rigid")
     T1 = eutil.getMatrixFromGmmPara(para)
     T_init = T0 * T1
     moving_points = points['Contour'].copy()
     moving_points_cen_result = points['Centerline'].copy()
     del new_movingData
     
     # Use GMMREG for centerline-based TPS registration
     new_movingData = db.BasicData(mov_img, db.ImageInfo(fixedData.getInfo().data), 
         {'Contour': moving_points, 'Centerline': moving_points_cen_result}) # The image has been resampled into fixed resolution
     tmp_img, points, para = gmm.register(new_fixedData, new_movingData, 1, False, "EM_TPS")
     result_points_cen = points['Centerline'].copy()
     result_points_cen = result_points_cen[result_points_cen[:, -1] >= 0]
     result_points_cen[:, :3] *= fixed_res
     del new_movingData
     del new_fixedData
     del moving_points_cen_result
     
     # Save the images for Elastix registration
     ee.writeImageFile(fixedData, "fix")
     ee.writeImageFile(movingData, "mov")
     fix_binary_mask = eutil.getBinaryImageFromSegmentation(fix_img, fixed_points_ori)
     fix_binary_data = db.BasicData(fix_binary_mask, db.ImageInfo(fixedData.getInfo().data))
     ee.writeImageFile(fix_binary_data, "fixmm")
     del fix_binary_data
     del fix_binary_mask
     fix_binary_mask = eutil.getBinaryImageFromSegmentation(fix_img, true_fixed_points)
     fix_binary_data = db.BasicData(fix_binary_mask, db.ImageInfo(fixedData.getInfo().data))
     ee.writeImageFile(fix_binary_data, "fixmmm")
     del fix_binary_data
     del fix_binary_mask
     mov_binary_mask = eutil.getBinaryImageFromSegmentation(mov_img, moving_points_ori)
     mov_binary_data = db.BasicData(mov_binary_mask, db.ImageInfo(movingData.getInfo().data))
     ee.writeImageFile(mov_binary_data, "movmm")
     del mov_binary_data
     del mov_binary_mask
     mov_binary_mask = eutil.getBinaryImageFromSegmentation(mov_img, true_moving_points)
     mov_binary_data = db.BasicData(mov_binary_mask, db.ImageInfo(movingData.getInfo().data))
     ee.writeImageFile(mov_binary_data, "movmmm")
     del mov_binary_data
     del mov_binary_mask
     
     fix_binary_mask = eutil.getMaskFromCenterline(fix_img, fixed_points_cen_ori, fixed_res)
     fix_binary_data = db.BasicData(fix_binary_mask, db.ImageInfo(fixedData.getInfo().data))
     ee.writeImageFile(fix_binary_data, "fixm")
     del fix_binary_data
     del fix_binary_mask
     mov_binary_mask = eutil.getMaskFromCenterline(mov_img, moving_points_cen_ori, moving_res)
     mov_binary_data = db.BasicData(mov_binary_mask, db.ImageInfo(movingData.getInfo().data))
     ee.writeImageFile(mov_binary_data, "movm")
     del mov_binary_data
     del mov_binary_mask
     
     tmp = moving_points_cen.copy()
     tmp[:, :3] *= moving_res
     ee.writePointsetFile(tmp[crop_moving_index], "movp.txt")
     ee.writePointsetFile(result_points_cen, "fixp.txt")
     
     init_para_inv = eutil.getElastixParaFromMatrix(T_init.I)
     ee.writeTransformFile(init_para_inv, fix_img.shape, fixed_res, type = "MI") # For transformation of image
     ee.writeTransformFile(init_para_inv, fix_img.shape, fixed_res, "transparassd.txt") # For transformation of image
     init_para = eutil.getElastixParaFromMatrix(T_init)
     ee.writeTransformFile(init_para, fix_img.shape, fixed_res, "transpara2.txt") # For transformation of points
     
     # Apply the initial transformation (It seems -t0 didn't work in Elastix)
     ee.run_executable(type = "transformix", mov = "movp.txt", tp = "transpara2.txt")
     ee.writePointsetFileFromResult("Output/outputpoints.txt", "movp0.txt")
     
     tmp = moving_points_ori.copy()
     tmp[:, :3] *= moving_res
     ee.writePointsetFile(tmp, "mov.txt")
     ee.run_executable(type = "transformix", mov = "mov.txt", tp = "transpara2.txt") # Transform the moving segmentation result using initial transformation
     ee.writePointsetFileFromResult("Output/outputpoints.txt", "mov0.txt")
     
     ee.changeOutputBSplineOrder("transpara.txt", 3)
     ee.run_executable(type = "transformix", mov = "mov.mhd", tp = "transpara.txt", outDir = "")
     ee.renameImage("result", "mov0")
     ee.changeOutputBSplineOrder("transpara.txt", 0)
     ee.run_executable(type = "transformix", mov = "movmm.mhd", tp = "transparassd.txt", outDir = "")
     ee.renameImage("result", "movmm0")
     ee.run_executable(type = "transformix", mov = "movm.mhd", tp = "transparassd.txt", outDir = "")
     ee.renameImage("result", "movm0")
     ee.run_executable(type = "transformix", mov = "movmmm.mhd", tp = "transparassd.txt", outDir = "")
     ee.renameImage("result", "movmmm0")
     
     sa = SurfaceErrorAnalysis(None)
     
     # Start registration of different parameters
     cnt = len(regPara)
     result = npy.zeros([cnt, 3], dtype = npy.float32)
     fix_img_mask = ee.readImageFile("fixmmm.mhd")
     time2 = time.time()
     init_time = time2 - time1
     for i in range(0, cnt):
         if regPara[i][2] == "MI" and regPara[i][1] > 0:
             ww = regPara[i][1] / 1000
         else:
             ww = regPara[i][1]
         
         isRigid = regPara[i][0] < 0
         # Save Elastix registration configuration
         ee.writeParameterFile("para_rigid.txt", "rigid", regPara[i][2], regPara[i][0], ww, w2)
         if not isRigid:
             ee.writeParameterFile("para_spline.txt", "bspline", regPara[i][2], regPara[i][0], ww, w2)
         
         # Use Elastix for hybrid registration
         if isRigid:
             para_elastix = ["para_rigid.txt"]
         else:
             para_elastix = ["para_rigid.txt", "para_spline.txt"]
         
         if regPara[i][2] == "SSD":
             mov_name = "movmm0.mhd"
             fix_name = "fixmm.mhd"
         else:
             mov_name = "mov0.mhd"
             fix_name = "fix.mhd"
         time1 = time.time()
         code = ee.run_executable(type = "elastix", para = para_elastix, 
             fix = fix_name, mov = mov_name, movm = "movm0.mhd", movp = "movp0.txt", mask = (regPara[i][2] != "SSD"))
         time2 = time.time()
         if code != 0:
             print "Elastix error!"
             continue
         
         # Read the output files into self data formats
         ee.changeOutputBSplineOrder("Output/TransformParameters.0.txt", 0)
         if not isRigid:
             ee.changeOutputBSplineOrder("Output/TransformParameters.1.txt", 0)
             ee.run_executable(type = "transformix", mov = "movmmm0.mhd", tp = "Output/TransformParameters.1.txt") # Non-rigid transformation
             ee.changeOutputInitTransform("Output/TransformParameters.1.txt")
         else:
             ee.run_executable(type = "transformix", mov = "movmmm0.mhd", tp = "Output/TransformParameters.0.txt")
             ee.changeOutputBSplineOrder("Output/TransformParameters.0.txt", 0)
             
         result_img_mask = ee.readImageFile("Output/result.mhd")
         if regPara[i][2] == "SSD":
             # Transform the segmentation result for evaluation
             '''
             if isRigid:
                 result_img_mask = ee.readImageFile("Output/result.0.mhd")
             else:
                 result_img_mask = ee.readImageFile("Output/result.1.mhd")
             '''
             if cnt == 1:
             #if True:
                 ee.changeOutputBSplineOrder("Output/TransformParameters.0.txt", 3)
                 if not isRigid:
                     ee.changeOutputBSplineOrder("Output/TransformParameters.1.txt", 3)
                     ee.run_executable(type = "transformix", mov = "mov0.mhd", tp = "Output/TransformParameters.1.txt") # Non-rigid transformation
                     ee.changeOutputInitTransform("Output/TransformParameters.1.txt")
                 else:
                     ee.run_executable(type = "transformix", mov = "mov0.mhd", tp = "Output/TransformParameters.0.txt")
                 
                 result_img = ee.readImageFile("Output/result.mhd")
                 print i, 'SSD'
             
         else:
             if cnt == 1:
             #if True:
                 if isRigid:
                     result_img = ee.readImageFile("Output/result.0.mhd")
                     print i, 'Other'
                 else:
                     result_img = ee.readImageFile("Output/result.1.mhd")
             
             
             
         ee.generateInverseTransformFile("Output/TransformParameters.0.txt", "fix.mhd")
         
         # Delete the mask slice from the moving points
         tmp = true_moving_points.copy()
         for point in movingData.getPointSet('Mask'):
             tmp = npy.delete(tmp, npy.where((npy.abs(tmp[:, 2] - point[2]) < 0.0001) & (npy.round(tmp[:, -1]) == point[3])), axis = 0)
         tmp[:, :3] *= moving_res
         ee.writePointsetFile(tmp, "movm.txt")
         ee.run_executable(type = "transformix", mov = "movm.txt", tp = "transpara2.txt") # Transform the moving segmentation result using initial transformation
         ee.writePointsetFileFromResult("Output/outputpoints.txt", "mov0m.txt")
         ee.run_executable(type = "transformix", mov = "mov0m.txt", tp = "TransformParameters.0.txt") # Transform the moving segmentation result using rigid transformation
         if not isRigid:
             ee.generateInverseTransformFile("Output/TransformParameters.1.txt", "fix.mhd")
             ee.writePointsetFile(ee.readPointsetFile("Output/outputpoints.txt"), "Output/outputpoints2.txt")
             ee.run_executable(type = "transformix", mov = "Output/outputpoints2.txt", tp = "TransformParameters.0.txt") # Non-rigid transformation
         
         result_con = tmp.copy()
         result_con[:, :3] = ee.readPointsetFile("Output/outputpoints.txt")
         result_con[:, :3] /= fixed_res
         
         result_pointset = {'Contour': result_con}
         
         if cnt > 1:
         #if False:
             dataset = db.BasicData(npy.array([[[0]]]), fixedData.getInfo(), result_pointset)
             mean_dis, mean_whole, max_dis, max_whole = sa.analysis(dataset, point_data_fix = true_fixed_points, useResult = True)
             del dataset
             
             dice_index = eutil.calDiceIndexFromMask(fix_img_mask, result_img_mask)
             del result_img_mask
             
             del result_pointset
             del result_con
                 
             result[i, :] = [mean_whole, dice_index, time2 - time1]# + init_time]
             print "Result of spacing %fmm, weight %f and metric %s: %fmm, %f. " % (regPara[i][0], ww, regPara[i][2], mean_whole, dice_index)
         
         '''
         # Save the result
         resultData = db.ResultData(result_img, db.ImageInfo(fixedData.info.data), result_pointset)
         resultData.info.addData('fix', 1)
         resultData.info.addData('move', 2)
         resultData.info.addData('transform', [0, 0, 0])
         db.saveMatData('D:/Python src/MIRVAP/Result/Result' + str(i) + '_37L.mat', [resultData, fixedData, movingData], 0)
         del resultData
         '''
     
     del fix_img_mask
     if cnt > 1:
         result_img = None
         result_pointset = None
     else:
         result = [0, 0, 0]
     return result_img, result_pointset, result