from
PyQt5.QtWidgets
import
*
import
sys
import
numpy as np
import
pyqtgraph as pg
from
PyQt5.QtGui
import
*
from
PyQt5.QtCore
import
*
class
Window(QMainWindow):
def
__init__(
self
):
super
().__init__()
self
.setWindowTitle(
"PyQtGraph"
)
self
.setGeometry(
100
,
100
,
900
,
550
)
icon
=
QIcon(
"skin.png"
)
self
.setWindowIcon(icon)
self
.UiComponents()
self
.show()
def
UiComponents(
self
):
widget
=
QWidget()
text
=
"Image Analysis"
label
=
QLabel(text)
label.setMinimumWidth(
130
)
label.setWordWrap(
True
)
win
=
pg.GraphicsLayoutWidget()
p1
=
win.addPlot(title
=
"")
img
=
pg.ImageItem()
p1.addItem(img)
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
])
p1.addItem(roi)
roi.setZValue(
10
)
iso
=
pg.IsocurveItem(level
=
1.2
, pen
=
'r'
)
iso.setParentItem(img)
iso.setZValue(
5
)
hist
=
pg.HistogramLUTItem()
hist.setImageItem(img)
win.addItem(hist)
isoLine
=
pg.InfiniteLine(angle
=
0
, movable
=
True
, pen
=
'r'
)
hist.vb.addItem(isoLine)
hist.vb.setMouseEnabled(y
=
False
)
isoLine.setValue(
0.8
)
isoLine.setZValue(
1000
)
win.nextRow()
p2
=
win.addPlot(colspan
=
2
)
p2.setMaximumHeight(
250
)
data
=
np.random.normal(size
=
(
200
,
100
))
data[
20
:
80
,
20
:
80
]
+
=
2.
data
=
pg.gaussianFilter(data, (
3
,
3
))
data
+
=
np.random.normal(size
=
(
200
,
100
))
*
0.1
img.setImage(data)
hist.setLevels(data.
min
(), data.
max
())
iso.setData(pg.gaussianFilter(data, (
2
,
2
)))
img.scale(
0.2
,
0.2
)
img.translate(
-
50
,
0
)
p1.autoRange()
def
updatePlot():
selected
=
roi.getArrayRegion(data, img)
p2.plot(selected.mean(axis
=
0
), clear
=
True
)
roi.sigRegionChanged.connect(updatePlot)
updatePlot()
def
updateIsocurve():
iso.setLevel(isoLine.value())
isoLine.sigDragged.connect(updateIsocurve)
def
imageHoverEvent(event):
if
event.isExit():
p1.setTitle("")
return
pos
=
event.pos()
i, j
=
pos.y(), pos.x()
i
=
int
(np.clip(i,
0
, data.shape[
0
]
-
1
))
j
=
int
(np.clip(j,
0
, data.shape[
1
]
-
1
))
val
=
data[i, j]
ppos
=
img.mapToParent(pos)
x, y
=
ppos.x(), ppos.y()
p1.setTitle(
"pos: (%0.1f, %0.1f) pixel: (%d, %d) value: %g"
%
(x, y, i, j, val))
img.hoverEvent
=
imageHoverEvent
layout
=
QGridLayout()
label.setMinimumWidth(
130
)
widget.setLayout(layout)
layout.addWidget(label,
1
,
0
)
layout.addWidget(win,
0
,
1
,
3
,
1
)
self
.setCentralWidget(widget)
App
=
QApplication(sys.argv)
window
=
Window()
sys.exit(App.
exec
())