Wed 28 Aug 21:38:52 CEST 2024
This commit is contained in:
		
							parent
							
								
									ad17606813
								
							
						
					
					
						commit
						6f334311c9
					
				
							
								
								
									
										324
									
								
								src/SimNDT/gui/loadScenarioFromImageController.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										324
									
								
								src/SimNDT/gui/loadScenarioFromImageController.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,324 @@ | |||
| __author__ = 'Miguel' | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| import os, sys | ||||
| from PySide.QtCore import * | ||||
| from PySide.QtGui import * | ||||
| 
 | ||||
| from SimNDT.graphics.mplWidget import MplCanvas | ||||
| from SimNDT.gui.ui_loadimagemainwindow import Ui_LoadImageMainWindow | ||||
| from SimNDT.gui.Warnings import WarningParms | ||||
| from SimNDT.gui.constants import * | ||||
| 
 | ||||
| import numpy as np | ||||
| from scipy.misc  import imread, imrotate | ||||
| from scipy.ndimage.filters import median_filter | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| from scipy.cluster.vq import kmeans2, kmeans | ||||
| import  matplotlib.cm as cm | ||||
| 
 | ||||
| 
 | ||||
| def rgb2gray(rgb): | ||||
|     return np.dot(rgb[...,:3], [0.299, 0.587, 0.144]) | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| class LoadImageWindowMain(QMainWindow, Ui_LoadImageMainWindow): | ||||
| 
 | ||||
| 	def __init__(self, parent=None): | ||||
| 		super(LoadImageWindowMain, self).__init__(parent) | ||||
| 		self.setupUi(self) | ||||
| 
 | ||||
| 		self.colormapComboBox = QComboBox() | ||||
| 		self.colormapComboBox.addItems(['jet','spectral','other']) | ||||
| 		self.colormapComboBox.setEnabled(False) | ||||
| 
 | ||||
| 		self.infoLabel = QLabel("Info") | ||||
| 		self.statusLabel = QLabel("Status") | ||||
| 		self.moreInfoLabel = QLabel("More Info") | ||||
| 		self.toolBar.addWidget(self.colormapComboBox) | ||||
| 		self.toolBar.addSeparator() | ||||
| 		self.toolBar.addWidget(self.infoLabel) | ||||
| 		self.toolBar.addSeparator() | ||||
| 		self.toolBar.addWidget(self.statusLabel) | ||||
| 		self.toolBar.addSeparator() | ||||
| 		self.toolBar.addWidget(self.moreInfoLabel) | ||||
| 
 | ||||
| 
 | ||||
| 	def setEnabledToolbar(self, state): | ||||
| 
 | ||||
| 		self.actionFlip_Horizontal.setEnabled(state) | ||||
| 		self.actionFlip_Vertical.setEnabled(state) | ||||
| 		self.actionRotate_90_Clockwise.setEnabled(state) | ||||
| 		self.actionRotate_90_Counter_Clockwise.setEnabled(state) | ||||
| 		self.actionShow_Original_Image.setEnabled(state) | ||||
| 
 | ||||
| 
 | ||||
| 		self.numberLabelsLabel.setVisible(state) | ||||
| 		self.PixelLabel.setVisible(state) | ||||
| 
 | ||||
| 
 | ||||
| 		self.getLabeledImagePushButton.setVisible(state) | ||||
| 		self.numberLabelsSpinBox.setVisible(state) | ||||
| 		self.PixelLineEdit.setVisible(state) | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| class LoadScenarioFromImage(QDialog): | ||||
| 
 | ||||
| 
 | ||||
| 	def __init__(self, filename= None, parent=None): | ||||
| 		super(LoadScenarioFromImage, self).__init__(parent) | ||||
| 		self.init() | ||||
| 		self.connectionSetup() | ||||
| 
 | ||||
| 		self.filename = filename | ||||
| 		self.imageToDraw = None | ||||
| 		self.Pixel = None | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 	def init(self): | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 		self.mainwindow = LoadImageWindowMain() | ||||
| 		self.mainwindow.setEnabledToolbar(False) | ||||
| 
 | ||||
| 		buttonBox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) | ||||
| 		self.connect(buttonBox, SIGNAL("accepted()"), self, SLOT("accept()")) | ||||
| 		self.connect(buttonBox, SIGNAL("rejected()"), self, SLOT("reject()")) | ||||
| 
 | ||||
| 		layout = QVBoxLayout() | ||||
| 		layout.addWidget(self.mainwindow) | ||||
| 		layout.addWidget(buttonBox) | ||||
| 		self.setLayout(layout) | ||||
| 
 | ||||
| 		w =  self.mainwindow.imageFrame.width() | ||||
| 		h =  self.mainwindow.imageFrame.height() | ||||
| 
 | ||||
| 		self.mpl = MplCanvas(width=int(w/100.0), height=int(h/100.0), dpi=100) | ||||
| 		self.mpl.ax.axis("off") | ||||
| 
 | ||||
| 		imageLayout = QVBoxLayout() | ||||
| 		imageLayout.addWidget(self.mpl) | ||||
| 
 | ||||
| 		self.mainwindow.imageFrame.setLayout(imageLayout) | ||||
| 		self.mainwindow.infoLabel.clear() | ||||
| 		self.mainwindow.statusLabel.clear() | ||||
| 		self.mainwindow.moreInfoLabel.clear() | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 	def connectionSetup(self): | ||||
| 		self.mainwindow.actionOpen_Image.triggered.connect(self.openImage) | ||||
| 		self.mainwindow.actionShow_Original_Image.triggered.connect(self.showOriginalImage) | ||||
| 		self.mainwindow.actionRotate_90_Clockwise.triggered.connect(self.rotate90ClockWise) | ||||
| 		self.mainwindow.actionRotate_90_Counter_Clockwise.triggered.connect(self.rotate90CounterClockWise) | ||||
| 		self.mainwindow.actionFlip_Horizontal.triggered.connect(self.flipHorizontal) | ||||
| 		self.mainwindow.actionFlip_Vertical.triggered.connect(self.flipVertical) | ||||
| 		self.mainwindow.colormapComboBox.currentIndexChanged.connect(self.changeColormap) | ||||
| 		self.mainwindow.getLabeledImagePushButton.pressed.connect(self.getLabeledImage) | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 	def openImage(self): | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 		self.mainwindow.statusLabel.clear() | ||||
| 		self.mainwindow.moreInfoLabel.clear() | ||||
| 
 | ||||
| 
 | ||||
| 		self.labels = None | ||||
| 		self.image_labeled = None | ||||
| 
 | ||||
| 		dir = os.path.dirname(self.filename) if self.filename is not None else "." | ||||
| 		fname, filters =  QFileDialog.getOpenFileName(None, "Load Image", dir,  self.tr("Image Files (*.png *.jpg *.bmp *.jpeg)")) | ||||
| 
 | ||||
| 		if fname: | ||||
| 
 | ||||
| 			self.imageOriginal   = imread(fname) | ||||
| 			try: | ||||
| 				M,N, R = np.shape(self.imageOriginal) | ||||
| 				self.mainwindow.colormapComboBox.setEnabled(False) | ||||
| 			except: | ||||
| 				M,N = np.shape(self.imageOriginal) | ||||
| 				self.mainwindow.colormapComboBox.setEnabled(True) | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 			self.imageToDraw = self.imageOriginal | ||||
| 			self.mainwindow.setEnabledToolbar(True) | ||||
| 			self.updateImage() | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 	def changeColormap(self, index): | ||||
| 
 | ||||
| 		if self.imageToDraw is not None: | ||||
| 
 | ||||
| 			if index==0: | ||||
| 				Colormap = cm.jet | ||||
| 			elif index ==1: | ||||
| 				Colormap = cm.spectral | ||||
| 			elif index ==2: | ||||
| 				Colormap = cm.Set1 | ||||
| 
 | ||||
| 			self.mpl.fig.clear() | ||||
| 			self.mpl.ax  = self.mpl.fig.add_subplot(111) | ||||
| 			cax  = self.mpl.ax.imshow(self.imageToDraw, cmap = Colormap, vmin=0, vmax = 255) | ||||
| 			self.showColorbar(cax) | ||||
| 			self.mpl.ax.axis("off") | ||||
| 			self.mpl.draw() | ||||
| 			QCoreApplication.processEvents() | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 			return cax | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 	def showOriginalImage(self): | ||||
| 
 | ||||
| 		self.mainwindow.statusLabel.clear() | ||||
| 		self.mainwindow.moreInfoLabel.clear() | ||||
| 
 | ||||
| 		self.imageToDraw = self.imageOriginal | ||||
| 		self.updateImage() | ||||
| 
 | ||||
| 
 | ||||
| 	def rotate90ClockWise(self): | ||||
| 
 | ||||
| 		self.imageToDraw = imrotate(self.imageToDraw,-90, interp = 'nearest') | ||||
| 		self.updateImage() | ||||
| 
 | ||||
| 	def rotate90CounterClockWise(self): | ||||
| 
 | ||||
| 		self.imageToDraw = imrotate(self.imageToDraw,90, interp = 'nearest') | ||||
| 		self.updateImage() | ||||
| 
 | ||||
| 
 | ||||
| 	def flipHorizontal(self): | ||||
| 
 | ||||
| 		self.imageToDraw = np.fliplr(self.imageToDraw) | ||||
| 		self.updateImage() | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 	def flipVertical(self): | ||||
| 
 | ||||
| 		self.imageToDraw = np.flipud(self.imageToDraw) | ||||
| 		self.updateImage() | ||||
| 
 | ||||
| 	def updateImage(self): | ||||
| 
 | ||||
| 		self.mainwindow.statusLabel.clear() | ||||
| 		self.mainwindow.moreInfoLabel.clear() | ||||
| 
 | ||||
| 		self.mpl.ax.imshow(self.imageToDraw) | ||||
| 		self.mpl.ax.axis("off") | ||||
| 		self.mpl.draw() | ||||
| 		QCoreApplication.processEvents() | ||||
| 
 | ||||
| 		try: | ||||
| 			M,N, R = np.shape(self.imageToDraw) | ||||
| 			self.mainwindow.colormapComboBox.setEnabled(False) | ||||
| 		except: | ||||
| 			M,N = np.shape(self.imageToDraw) | ||||
| 
 | ||||
| 		self.mainwindow.infoLabel.setText("Dimensions: %d x %d"%(M,N)) | ||||
| 
 | ||||
| 
 | ||||
| 	def getLabeledImage(self): | ||||
| 
 | ||||
| 		self.labels = None | ||||
| 
 | ||||
| 		self.mainwindow.colormapComboBox.setEnabled(True) | ||||
| 		self.mainwindow.statusLabel.setText(self.tr("Procesing......")) | ||||
| 		QCoreApplication.processEvents() | ||||
| 
 | ||||
| 		try: | ||||
| 			M,N, R = np.shape(self.imageToDraw) | ||||
| 			self.image_gray = rgb2gray(self.imageToDraw) | ||||
| 		except: | ||||
| 			M,N = np.shape(self.imageToDraw) | ||||
| 
 | ||||
| 
 | ||||
| 		n_colors = self.mainwindow.numberLabelsSpinBox.value() | ||||
| 		self.image = median_filter(self.image_gray,2) | ||||
| 		image_array = np.reshape(self.image, (M*N,1)) | ||||
| 		centroids, self.labels = kmeans2(image_array, n_colors) | ||||
| 		check =  np.size(np.unique(self.labels)) | ||||
| 
 | ||||
| 		if check != n_colors: | ||||
| 			self.image_labeled = np.zeros((M,N)) | ||||
| 			self.mpl.fig.clear() | ||||
| 			self.mpl.ax  = self.mpl.fig.add_subplot(111) | ||||
| 			self.mpl.ax.imshow(np.zeros((M,N)), cmap = cm.jet, vmin=0, vmax = 255) | ||||
| 			self.mpl.ax.axis("off") | ||||
| 			self.mpl.draw() | ||||
| 
 | ||||
| 			QCoreApplication.processEvents() | ||||
| 			msgBox = WarningParms("Try again") | ||||
| 			if msgBox.exec_(): | ||||
| 				self.mainwindow.statusLabel.clear() | ||||
| 				QCoreApplication.processEvents() | ||||
| 				return | ||||
| 
 | ||||
| 
 | ||||
| 		self.labels *= 40 | ||||
| 
 | ||||
| 
 | ||||
| 		self.image_labeled = np.reshape(self.labels, (M,N)) | ||||
| 		self.imageToDraw = self.image_labeled | ||||
| 
 | ||||
| 		index = self.mainwindow.colormapComboBox.currentIndex() | ||||
| 		cax = self.changeColormap(index) | ||||
| 
 | ||||
| 		self.mpl.draw() | ||||
| 		self.mainwindow.moreInfoLabel.setText(self.tr("<b>Apply several times to change labels")) | ||||
| 		self.mainwindow.statusLabel.setText(self.tr("Done")) | ||||
| 		QCoreApplication.processEvents() | ||||
| 
 | ||||
| 
 | ||||
| 	def showColorbar(self, cax): | ||||
| 
 | ||||
| 		if self.labels is not None: | ||||
| 
 | ||||
| 			ticks_at = np.unique(self.labels) | ||||
| 			cbar = self.mpl.fig.colorbar(cax, ticks=ticks_at, orientation='horizontal') | ||||
| 			cbar.set_label("Labels") | ||||
| 
 | ||||
| 
 | ||||
| 	def accept(self): | ||||
| 
 | ||||
| 
 | ||||
| 		if self.image_labeled is None: | ||||
| 			msgBox = WarningParms("Get the labeled Image") | ||||
| 			if msgBox.exec_(): | ||||
| 				return | ||||
| 
 | ||||
| 		try: | ||||
| 			self.Pixel = float(self.mainwindow.PixelLineEdit.text()) | ||||
| 
 | ||||
| 		except: | ||||
| 			msgBox = WarningParms("Please give correctly the Pixel/mm") | ||||
| 			if msgBox.exec_(): | ||||
| 				return | ||||
| 
 | ||||
| 		QDialog.accept(self) | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user