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