Segmentación de datos usando PyQtGraph

En este artículo, veremos cómo podemos realizar el corte de datos utilizando el módulo PyQtGraph en Python. PyQtGraph es una biblioteca de interfaz de usuario y gráficos para Python que proporciona la funcionalidad comúnmente requerida en el diseño y las aplicaciones científicas. Sus objetivos principales son proporcionar gráficos rápidos e interactivos para mostrar datos (gráficos, videos, etc.) y, en segundo lugar, proporcionar herramientas para ayudar en el desarrollo rápido de aplicaciones (por ejemplo, árboles de propiedades como los que se usan en Qt Designer).

Para instalar PyQtGraph usamos el siguiente comando

pip install pyqtgraph

Un segmento en una array multidimensional es una columna de datos que corresponde a un solo valor para uno o más miembros de la dimensión. Rebanar es el acto de dividir el cubo para extraer esta información para una porción determinada. Es importante porque ayuda al usuario a visualizar y recopilar información específica de una dimensión. Cuando piense en dividir, piense en ello como un filtro especializado para un valor particular en una dimensión. Una tarea simple de corte de datos sería, para datos 3D dados, seleccionar un plano 2D e interpolar datos a lo largo de ese plano para generar una imagen de corte.
 

Para hacer esto, tenemos que hacer lo siguiente 

  • Importe las bibliotecas requeridas como pyqtgraph, pyqt5 y numpy
  • Crea una clase de ventana principal usando pyqt5
  • Cree una ventana de gráfico para agregar los widgets necesarios para mostrar el corte
  • Cree dos objetos de vista de imagen en el diseño, primero para mostrar los datos 3D completos y segundo para mostrar el corte
  • Cree un objeto roi y agréguelo a la primera vista de imagen para seleccionar el segmento
  • Cree datos en 3D y agréguelos a la vista de imagen.
  • Conecte un método de actualización al objeto roi cuando se cambie la región, dentro del método de actualización obtenga la región y configúrela en la segunda vista de imagen
  • Agregue esta ventana de gráfico al diseño de la ventana principal con cualquier widget adicional.

A continuación se muestra la implementación.

Python3

# importing Qt widgets
from PyQt5.QtWidgets import *
 
# importing system
import sys
 
# importing numpy as np
import numpy as np
 
# importing pyqtgraph as pg
import pyqtgraph as pg
from PyQt5.QtGui import *
from PyQt5.QtCore import *
 
 
class Window(QMainWindow):
 
    def __init__(self):
        super().__init__()
 
        # setting title
        self.setWindowTitle("PyQtGraph")
 
        # setting geometry
        self.setGeometry(100, 100, 700, 550)
 
        # icon
        icon = QIcon("skin.png")
 
        # setting icon to the window
        self.setWindowIcon(icon)
 
        # calling method
        self.UiComponents()
 
        # showing all the widgets
        self.show()
 
    # method for components
    def UiComponents(self):
 
        # creating a widget object
        widget = QWidget()
 
        # text
        text = "Data Slicing"
 
        # creating a label
        label = QLabel(text)
 
        # setting minimum width
        label.setMinimumWidth(130)
 
        # making label do word wrap
        label.setWordWrap(True)
 
        # creating a window for graphs
        win = QMainWindow()
 
        # creating a widget object
        cwid = QWidget()
 
        # setting central widget to the graph window
        win.setCentralWidget(cwid)
 
        # creating a grid layout
        lay = QGridLayout()
 
        # setting grid layout to central widget of graphs
        cwid.setLayout(lay)
 
        # creating a image view objects
        imv1 = pg.ImageView()
        imv2 = pg.ImageView()
 
        # adding image view objects to the layout
        lay.addWidget(imv1, 0, 0)
        lay.addWidget(imv2, 1, 0)
 
        # creating a ROI object for selecting slice
        roi = pg.LineSegmentROI([[30, 64], [100, 64]], pen='r')
 
        # add roi to image view 1
        imv1.addItem(roi)
 
        # creating 3d data
        # x value using numpy
        x1 = np.linspace(-30, 10, 128)[:, np.newaxis, np.newaxis]
        x2 = np.linspace(-20, 20, 128)[:, np.newaxis, np.newaxis]
 
        # y value using numpy
        y = np.linspace(-30, 10, 128)[np.newaxis, :, np.newaxis]
        z = np.linspace(-20, 20, 128)[np.newaxis, np.newaxis, :]
 
        # dimension 1 values
        d1 = np.sqrt(x1 ** 2 + y ** 2 + z ** 2)
 
        # dimension 2 values
        d2 = 2 * np.sqrt(x1[::-1] ** 2 + y ** 2 + z ** 2)
 
        # dimension 3 value
        d3 = 4 * np.sqrt(x2 ** 2 + y[:, ::-1] ** 2 + z ** 2)
 
        # whole data ie all 3 dimensions
        data = (np.sin(d1) / d1 ** 2) + \
            (np.sin(d2) / d2 ** 2) + (np.sin(d3) / d3 ** 2)
 
        # method to update the image view 2
        def update():
 
            # get the roi selected data from image view 1
            d2 = roi.getArrayRegion(data, imv1.imageItem, axes=(1, 2))
 
            # update the image view 2 data
            imv2.setImage(d2)
 
        # adding update method to the roi
        # when region is changed this method get called
        roi.sigRegionChanged.connect(update)
 
        # Display the data in both image view
        imv1.setImage(data)
 
        # setting the range of image view
        imv1.setHistogramRange(-0.01, 0.01)
 
        # setting levels of the image view
        imv1.setLevels(-0.003, 0.003)
 
        # call the update method
        update()
 
        # Creating a grid layout
        layout = QGridLayout()
 
        # minimum width value of the label
        label.setMinimumWidth(130)
 
        # setting this layout to the widget
        widget.setLayout(layout)
 
        # adding label in the layout
        layout.addWidget(label, 1, 0)
 
        # plot window goes on right side, spanning 3 rows
        layout.addWidget(win, 0, 1, 3, 1)
 
        # setting this widget as central widget of the main widow
        self.setCentralWidget(widget)
 
 
# create pyqt5 app
App = QApplication(sys.argv)
 
# create the instance of our Window
window = Window()
 
# start the app
sys.exit(App.exec())

Producción : 
 

Publicación traducida automáticamente

Artículo escrito por rakshitarora y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *