Ejemplo n.º 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
Ejemplo n.º 2
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
Ejemplo n.º 3
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
Ejemplo n.º 4
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(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
Ejemplo n.º 5
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
Ejemplo n.º 6
0
 def load(self, dir):
     result = []
     for name in dir:
         data, info, point = db.loadMatData(name, self.gui.dataModel)
         if info.getData('fix') is not None:
             fileData = db.ResultData(data, info, point)
         else:
             fileData = db.BasicData(data, info, point)
         result.append(fileData)
     return result
Ejemplo n.º 7
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 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
Ejemplo n.º 8
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
Ejemplo n.º 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
Ejemplo n.º 10
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
Ejemplo n.º 11
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
Ejemplo n.º 12
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
Ejemplo n.º 13
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
Ejemplo n.º 14
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]
Ejemplo n.º 15
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
Ejemplo n.º 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