En este artículo, veremos cómo podemos realizar análisis de imágenes comunes 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 el segundo es 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 comando que se indica a continuación.
pip install pyqtgraph
El análisis de imágenes es la extracción de información significativa de las imágenes; principalmente a partir de imágenes digitales mediante técnicas de procesamiento de imágenes digitales. Las tareas de análisis de imágenes pueden ser tan simples como leer etiquetas con códigos de barras o tan sofisticadas como identificar a una persona por su rostro.
Para ello tenemos que hacer lo siguiente.
- Importe las bibliotecas requeridas como pyqtgraph, pyqt5 y numpy.
- Cree una clase de ventana principal usando pyqt5.
- Cree una ventana gráfica para agregar los widgets necesarios para mostrar el análisis de la imagen.
- Cree dos áreas de trazado y agréguele un elemento de imagen con el objeto roi en la primera área de trazado.
- Cree un objeto de isocurva y agréguelo al elemento de imagen.
- Cree datos para la imagen y agréguelos al elemento de la 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 área de trazado.
- Cree un evento de movimiento del mouse y establezca la posición, el valor de píxel en el título de acuerdo con la posición del mouse.
- 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, 900, 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 = "Image Analysis" # creating a label label = QLabel(text) # setting minimum width label.setMinimumWidth(130) # making label do word wrap label.setWordWrap(True) # creating a graphic layout widget win = pg.GraphicsLayoutWidget() # plot area (ViewBox + axes) for displaying the image p1 = win.addPlot(title="") # item for displaying image data img = pg.ImageItem() # adding image to the plot area p1.addItem(img) # Custom ROI for selecting an image region roi = pg.ROI([-10, 14], [5, 5]) roi.addScaleHandle([0.5, 1], [0.5, 0.5]) roi.addScaleHandle([0, 0.5], [0.5, 0.5]) # adding roi to the plot area p1.addItem(roi) # setting z value to roi # making sure ROI is drawn above image roi.setZValue(10) # creating a Isocurve drawing on the image iso = pg.IsocurveItem(level=1.2, pen='r') # setting parent as image iso.setParentItem(img) # setting z axis value of isocurve iso.setZValue(5) # Contrast/color control hist = pg.HistogramLUTItem() # setting image to the control hist.setImageItem(img) # adding control widget to the plot window win.addItem(hist) # creating draggable line for setting isocurve level isoLine = pg.InfiniteLine(angle=0, movable=True, pen='r') hist.vb.addItem(isoLine) # making user interaction a little easier hist.vb.setMouseEnabled(y=False) isoLine.setValue(0.8) # bring iso line above contrast controls isoLine.setZValue(1000) # going to next row of graphic window win.nextRow() # another plot area for displaying ROI data p2 = win.addPlot(colspan=2) # setting maximum height of plot area p2.setMaximumHeight(250) # generating image data data = np.random.normal(size=(200, 100)) data[20:80, 20:80] += 2. # setting gaussian filter to the data data = pg.gaussianFilter(data, (3, 3)) data += np.random.normal(size=(200, 100)) * 0.1 # setting data to the image img.setImage(data) # setting level hist.setLevels(data.min(), data.max()) # build isocurves from smoothed data iso.setData(pg.gaussianFilter(data, (2, 2))) # set position and scale of image img.scale(0.2, 0.2) img.translate(-50, 0) # zoom to fit image p1.autoRange() # method for updating the plot def updatePlot(): # getting the selected region by the roi selected = roi.getArrayRegion(data, img) # plot the selected region p2.plot(selected.mean(axis=0), clear=True) # connecting the update plot method # it get called when the region is changed roi.sigRegionChanged.connect(updatePlot) # call the update plot method updatePlot() # method for updating the isocurve def updateIsocurve(): # setting iso level iso.setLevel(isoLine.value()) isoLine.sigDragged.connect(updateIsocurve) # method for image hover event def imageHoverEvent(event): # showing the position, pixel, and value under the mouse cursor # if cursor is not on the plot area if event.isExit(): # set title as blank p1.setTitle("") return # getting cursor position pos = event.pos() i, j = pos.y(), pos.x() # pixel values i = int(np.clip(i, 0, data.shape[0] - 1)) j = int(np.clip(j, 0, data.shape[1] - 1)) # value of point val = data[i, j] ppos = img.mapToParent(pos) x, y = ppos.x(), ppos.y() # setting plot title data p1.setTitle( "pos: (%0.1f, %0.1f) pixel: (%d, %d) value: %g" % (x, y, i, j, val)) # Monkey-patch the image to use our custom hover function. img.hoverEvent = imageHoverEvent # 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 window 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