def _calculateCMatrix(self): self.logger.debug('Calculating GLRLM matrix in C') P_glrlm, angles = cMatrices.calculate_glrlm( self.matrix, self.maskArray, self.coefficients['Ng'], self.coefficients['Nr'], self.kwargs.get('force2D', False), self.kwargs.get('force2Ddimension', 0)) P_glrlm = self._applyMatrixOptions(P_glrlm, angles) return P_glrlm
def _calculateMatrix(self): self.logger.debug('Calculating GLRLM matrix in C') P_glrlm, angles = cMatrices.calculate_glrlm( self.matrix, self.maskArray, self.coefficients['Ng'], self.coefficients['Nr'], self.settings.get('force2D', False), self.settings.get('force2Ddimension', 0)) self.logger.debug('Process calculated matrix') # Optionally apply a weighting factor if self.weightingNorm is not None: self.logger.debug('Applying weighting (%s)', self.weightingNorm) # Correct the number of voxels for the number of times it is used (once per angle), affects run percentage self.coefficients['Np'] *= len(angles) pixelSpacing = self.inputImage.GetSpacing()[::-1] weights = numpy.empty(len(angles)) for a_idx, a in enumerate(angles): if self.weightingNorm == 'infinity': weights[a_idx] = max(numpy.abs(a) * pixelSpacing) elif self.weightingNorm == 'euclidean': weights[a_idx] = numpy.sqrt( numpy.sum((numpy.abs(a) * pixelSpacing)**2)) elif self.weightingNorm == 'manhattan': weights[a_idx] = numpy.sum(numpy.abs(a) * pixelSpacing) elif self.weightingNorm == 'no_weighting': weights[a_idx] = 1 else: self.logger.warning( 'weigthing norm "%s" is unknown, weighting factor is set to 1', self.weightingNorm) weights[a_idx] = 1 P_glrlm = numpy.sum(P_glrlm * weights[None, None, :], 2, keepdims=True) Nz = numpy.sum(P_glrlm, (0, 1)) # Delete empty angles if no weighting is applied if P_glrlm.shape[2] > 1: emptyAngles = numpy.where(Nz == 0) if len(emptyAngles[0]) > 0: # One or more angles are 'empty' self.logger.debug('Deleting %d empty angles:\n%s', len(emptyAngles[0]), angles[emptyAngles]) P_glrlm = numpy.delete(P_glrlm, emptyAngles, 2) Nz = numpy.delete(Nz, emptyAngles, 0) else: self.logger.debug('No empty angles') self.coefficients['Nz'] = Nz return P_glrlm
def _calculateCMatrix(self): self.logger.debug('Calculating GLRLM matrix in C') Ng = self.coefficients['Ng'] Nr = self.coefficients['Nr'] size = numpy.max(self.matrixCoordinates, 1) - numpy.min(self.matrixCoordinates, 1) + 1 angles = imageoperations.generateAngles(size, **self.kwargs) P_glrlm = cMatrices.calculate_glrlm(self.matrix, self.maskArray, angles, Ng, Nr) P_glrlm = self._applyMatrixOptions(P_glrlm, angles) return P_glrlm
def _calculateCMatrix(self): Ng = self.coefficients['Ng'] Nr = self.coefficients['Nr'] size = numpy.max(self.matrixCoordinates, 1) - numpy.min( self.matrixCoordinates, 1) + 1 angles = imageoperations.generateAngles(size) P_glrlm = cMatrices.calculate_glrlm(self.matrix, self.maskArray, angles, Ng, Nr) P_glrlm = self._applyMatrixOptions(P_glrlm, angles) return P_glrlm
def _calculateCMatrix(self): self.logger.debug('Calculating GLRLM matrix in C') Ng = self.coefficients['Ng'] Nr = self.coefficients['Nr'] size = numpy.max(self.matrixCoordinates, 1) - numpy.min(self.matrixCoordinates, 1) + 1 # Do not pass kwargs directly, as distances may be specified, which must be forced to [1] for this class angles = imageoperations.generateAngles(size, force2Dextraction=self.kwargs.get('force2D', False), force2Ddimension=self.kwargs.get('force2Ddimension', 0)) P_glrlm = cMatrices.calculate_glrlm(self.matrix, self.maskArray, angles, Ng, Nr) P_glrlm = self._applyMatrixOptions(P_glrlm, angles) return P_glrlm
def _calculateMatrix(self, voxelCoordinates=None): self.logger.debug('Calculating GLRLM matrix in C') Ng = self.coefficients['Ng'] Nr = numpy.max(self.imageArray.shape) matrix_args = [ self.imageArray, self.maskArray, Ng, Nr, self.settings.get('force2D', False), self.settings.get('force2Ddimension', 0) ] if self.voxelBased: matrix_args += [ self.settings.get('kernelRadius', 1), voxelCoordinates ] P_glrlm, angles = cMatrices.calculate_glrlm( *matrix_args) # shape (Nvox, Ng, Nr, Na) self.logger.debug('Process calculated matrix') # Delete rows that specify gray levels not present in the ROI NgVector = range(1, Ng + 1) # All possible gray values GrayLevels = self.coefficients[ 'grayLevels'] # Gray values present in ROI emptyGrayLevels = numpy.array( list(set(NgVector) - set(GrayLevels)), dtype=int) # Gray values NOT present in ROI P_glrlm = numpy.delete(P_glrlm, emptyGrayLevels - 1, 1) # Optionally apply a weighting factor if self.weightingNorm is not None: self.logger.debug('Applying weighting (%s)', self.weightingNorm) pixelSpacing = self.inputImage.GetSpacing()[::-1] weights = numpy.empty(len(angles)) for a_idx, a in enumerate(angles): if self.weightingNorm == 'infinity': weights[a_idx] = max(numpy.abs(a) * pixelSpacing) elif self.weightingNorm == 'euclidean': weights[a_idx] = numpy.sqrt( numpy.sum((numpy.abs(a) * pixelSpacing)**2)) elif self.weightingNorm == 'manhattan': weights[a_idx] = numpy.sum(numpy.abs(a) * pixelSpacing) elif self.weightingNorm == 'no_weighting': weights[a_idx] = 1 else: self.logger.warning( 'weigthing norm "%s" is unknown, weighting factor is set to 1', self.weightingNorm) weights[a_idx] = 1 P_glrlm = numpy.sum(P_glrlm * weights[None, None, None, :], 3, keepdims=True) Nr = numpy.sum(P_glrlm, (1, 2)) # Delete empty angles if no weighting is applied if P_glrlm.shape[3] > 1: emptyAngles = numpy.where(numpy.sum(Nr, 0) == 0) if len(emptyAngles[0]) > 0: # One or more angles are 'empty' self.logger.debug('Deleting %d empty angles:\n%s', len(emptyAngles[0]), angles[emptyAngles]) P_glrlm = numpy.delete(P_glrlm, emptyAngles, 3) Nr = numpy.delete(Nr, emptyAngles, 1) else: self.logger.debug('No empty angles') Nr[Nr == 0] = numpy.nan # set sum to numpy.spacing(1) if sum is 0? self.coefficients['Nr'] = Nr return P_glrlm