def reloadImageInNewImageItem(cmbROIs, graphicsView, pixelDataLabel, roiMeanLabel, self, buttonList, btnDraw, btnErase, zoomSlider, zoomLabel, imageSlider=None): try: logger.info("DisplayImageDrawROI.reloadImageInNewImageItem called") graphicsView.dictROIs.setPreviousRegionName(cmbROIs.currentText()) if imageSlider: imageNumber = imageSlider.value() else: imageNumber = 1 pixelArray = readDICOM_Image.returnPixelArray(self.selectedImagePath) mask = graphicsView.dictROIs.getMask(cmbROIs.currentText(), imageNumber) graphicsView.setImage(pixelArray, mask) pixelDataLabel.setText("Pixel Data:") roiMeanLabel.setText("ROI Mean Value:") setUpImageEventHandlers(self, graphicsView, pixelDataLabel, btnDraw, btnErase, roiMeanLabel, cmbROIs, buttonList, zoomSlider, zoomLabel, imageSlider) except Exception as e: print('Error in DisplayImageDrawROI.reloadImageInNewImageItem: ' + str(e)) logger.error( 'Error in DisplayImageDrawROI.reloadImageInNewImageItem: ' + str(e))
def returnPixelArray(imagePath, *args): """Applies a low and high threshold on an image and returns the resulting maskArray""" try: if os.path.exists(imagePath): pixelArray = readDICOM_Image.returnPixelArray(imagePath) derivedImage = thresholdPixelArray(pixelArray, *args) return derivedImage else: return None except Exception as e: print('Error in function thresholdDICOM_Image.returnPixelArray: ' + str(e))
def returnPixelArray(imagePath, func): """Applies the algorithm in the function, func to an image and returns the resulting PixelArray""" try: if os.path.exists(imagePath): dataset = readDICOM_Image.getDicomDataset(imagePath) pixelArray = readDICOM_Image.returnPixelArray(imagePath) derivedImage = func(pixelArray, dataset) return derivedImage else: return None except Exception as e: print('Error in function #.returnPixelArray: ' + str(e))
def displayImageROISubWindow(self, derivedImagePath=None): """ Creates a subwindow that displays one DICOM image and allows the creation of an ROI on it """ try: logger.info("DisplayImageDrawROI displayImageROISubWindow called") pixelArray = readDICOM_Image.returnPixelArray(self.selectedImagePath) hbox, layout, lblImageMissing, subWindow = setUpGraphicsViewSubWindow( self) windowTitle = displayImageCommon.getDICOMFileData(self) subWindow.setWindowTitle(windowTitle) graphicsView, zoomSlider, zoomLabel = setUpGraphicsView(hbox) pixelDataLabel, roiMeanLabel = setPixelDataLabels(layout) (cmbROIs, buttonList, btnDraw, btnErase) = setUpROIButtons(self, layout, pixelDataLabel, roiMeanLabel, graphicsView, zoomSlider, zoomLabel) spinBoxIntensity, spinBoxContrast = setUpLevelsSpinBoxes( layout, graphicsView, cmbROIs) if pixelArray is None: lblImageMissing.show() graphicsView.setImage(np.array([[0, 0, 0], [0, 0, 0]])) else: graphicsView.setImage(pixelArray) spinBoxIntensity.blockSignals(True) spinBoxIntensity.setValue(graphicsView.graphicsItem.intensity) spinBoxIntensity.blockSignals(False) spinBoxContrast.blockSignals(True) spinBoxContrast.setValue(graphicsView.graphicsItem.contrast) spinBoxContrast.blockSignals(False) setUpImageEventHandlers(self, graphicsView, pixelDataLabel, btnDraw, btnErase, roiMeanLabel, cmbROIs, buttonList, zoomSlider, zoomLabel) except (IndexError, AttributeError): subWindow.close() msgBox = QMessageBox() msgBox.setWindowTitle("View a DICOM series or image with an ROI") msgBox.setText("Select either a series or an image") msgBox.exec() except Exception as e: print('Error in DisplayImageDrawROI.displayImageROISubWindow: ' + str(e)) logger.error( 'Error in DisplayImageDrawROI.displayImageROISubWindow: ' + str(e))
def imageROISliderMoved(self, seriesName, imageList, imageSlider, lblImageMissing, pixelDataLabel, roiMeanLabel, cmbROIs, btnDraw, btnErase, spinBoxIntensity, spinBoxContrast, graphicsView, subWindow, buttonList, zoomSlider, zoomLabel): """On the Multiple Image with ROI Display sub window, this function is called when the image slider is moved. It causes the next image in imageList to be displayed""" try: logger.info("DisplayImageDrawROI.imageROISliderMoved called") imageNumber = imageSlider.value() currentImageNumber = imageNumber - 1 if currentImageNumber >= 0: self.selectedImagePath = imageList[currentImageNumber] #print("imageSliderMoved before={}".format(self.selectedImagePath)) pixelArray = readDICOM_Image.returnPixelArray( self.selectedImagePath) setButtonsToDefaultStyle(buttonList) if pixelArray is None: lblImageMissing.show() graphicsView.setImage(np.array([[0, 0, 0], [0, 0, 0]])) else: reloadImageInNewImageItem(cmbROIs, graphicsView, pixelDataLabel, roiMeanLabel, self, buttonList, btnDraw, btnErase, zoomSlider, zoomLabel, imageSlider) spinBoxIntensity.blockSignals(True) spinBoxIntensity.setValue(graphicsView.graphicsItem.intensity) spinBoxIntensity.blockSignals(False) spinBoxContrast.blockSignals(True) spinBoxContrast.setValue(graphicsView.graphicsItem.contrast) spinBoxContrast.blockSignals(False) setUpImageEventHandlers(self, graphicsView, pixelDataLabel, btnDraw, btnErase, roiMeanLabel, cmbROIs, buttonList, zoomSlider, zoomLabel, imageSlider) subWindow.setWindowTitle(seriesName + ' - ' + os.path.basename(self.selectedImagePath)) # print("imageSliderMoved after={}".format(self.selectedImagePath)) except Exception as e: print('Error in DisplayImageDrawROI.imageROISliderMoved: ' + str(e)) logger.error('Error in DisplayImageDrawROI.imageROISliderMoved: ' + str(e))
def displayROIMeanAndStd(self, roiMeanLabel, graphicsView, cmbROIs, imageSlider=None): logger.info("DisplayImageDrawROI.displayROIMeanAndStd called") if imageSlider: imageNumber = imageSlider.value() else: imageNumber = 1 pixelArray = readDICOM_Image.returnPixelArray(self.selectedImagePath) regionName = cmbROIs.currentText() mask = graphicsView.dictROIs.getMask(regionName, imageNumber) if mask is not None: mean, std = getRoiMeanAndStd(mask, pixelArray) str = "ROI mean = {}, standard deviation = {}".format(mean, std) else: str = "" roiMeanLabel.setText(str)