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
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
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
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
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
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
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
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
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
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
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
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
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
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]
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
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