首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有办法防止矩形比格图ROI不向左移动?

是否有办法防止矩形比格图ROI不向左移动?
EN

Stack Overflow用户
提问于 2022-02-18 18:18:30
回答 1查看 178关注 0票数 0

我有这段代码的一部分,我正在处理pyqtgraph。此外,我亦已订定各方面的居留权不能跨越的界限。当我移动任何一个垂直刻度手柄,它给ROI一个机会,左-右,如果点击它的内部。有什么办法可以防止这种情况发生吗?我只想让它向上-向下移动。这有点像在原始绑定中设置另一个绑定到ROI,具体取决于当前的X启动位置和X停止位置。

我尝试使用信号修改ROI类中的self.maxBound变量,但它变得混乱,ROI一直忽略正确的界限。

任何帮助都将得到很大的帮助。

代码语言:javascript
复制
from PyQt5.QtWidgets import (
    QApplication,
    QMainWindow,
    QGridLayout,
    QWidget)
import pyqtgraph as pg
import sys
import numpy as np
from PyQt5.QtCore import QRectF, QRect


class TestROI(QMainWindow):

    imageWidth = 1000
    imageHardLimitTop = 1048
    imageHardLimitBottom = 2047
    shallowestPixel = 1400
    deepestPixel = 1699
    ROITopBottomMargin = 20
    shaderDarkness = 185
    shaderColor = (0, 0, 50, shaderDarkness)
    imageHardLimitDepth = imageHardLimitBottom - imageHardLimitTop + 1

    def __init__(self):
        super(TestROI, self).__init__()

        self.mainWidget = QWidget()
        self.imagePlotCanvas = pg.GraphicsLayoutWidget()
        self.graphGridLayout = QGridLayout(self.mainWidget)
        self.graphGridLayout.addWidget(self.imagePlotCanvas)
        self.setCentralWidget(self.mainWidget)

        self.showMaximized()

        # Place for 2D images:
        self.plotArea = self.imagePlotCanvas.addPlot()
        self.plotArea.setRange(
            QRect(0, self.imageHardLimitTop, self.imageWidth, self.imageHardLimitDepth))
        self.plotArea.setLimits(xMin=-1000, xMax=2000)
        self.plotArea.setAspectLocked(True)
        self.plotArea.invertY(b=True)
        self.plotArea.showGrid(x=True, y=True, alpha=1.0)
        self.plotArea.showButtons()

        self.twoDImageROI = pg.ROI(pos=[0, self.shallowestPixel],
                                      size=[
                                          self.imageWidth, self.deepestPixel - self.shallowestPixel + 1],
                                      removable=False,
                                      maxBounds=QRectF(-1, self.imageHardLimitTop-1,
                                                       self.imageWidth + 2, self.imageHardLimitDepth+1),
                                      scaleSnap=False, translateSnap=False)
        self.twoDImageROI.setZValue(20)


        self.shadedTopRegion = pg.LinearRegionItem(
            [self.imageHardLimitTop, self.shallowestPixel], orientation=pg.LinearRegionItem.Horizontal, movable=False)
        self.shadedTopRegion.setBrush(color=self.shaderColor)
        self.shadedTopRegion.setZValue(10)
        self.plotArea.addItem(self.shadedTopRegion)

        self.shadedBottomRegion = pg.LinearRegionItem(
            [self.deepestPixel + 1, self.imageHardLimitBottom+1], orientation=pg.LinearRegionItem.Horizontal, movable=False)
        self.shadedBottomRegion.setBrush(color=self.shaderColor)
        self.shadedBottomRegion.setZValue(10)
        self.plotArea.addItem(self.shadedBottomRegion)

        # self.twoDImageROI.setAcceptedMouseButtons(Qt.LeftButton)
        self.twoDImageROI.sigRegionChanged.connect(self.imageROIChanged)

        # Shaded Region on the left and right to cover up the above two vertical lines when out of image bound.
        self.shadedLeftRegion = pg.LinearRegionItem(
            [-1000, 0], orientation=pg.LinearRegionItem.Vertical, movable=False)
        self.shadedLeftRegion.setBrush(color=(0, 0, 0))
        self.shadedLeftRegion.setZValue(20)
        self.plotArea.addItem(self.shadedLeftRegion)

        self.shadedRightRegion = pg.LinearRegionItem(
            [1000, 2000], orientation=pg.LinearRegionItem.Vertical, movable=False)
        self.shadedRightRegion.setBrush(color=(0, 0, 0))
        self.shadedRightRegion.setZValue(20)
        self.plotArea.addItem(self.shadedRightRegion)

        self.twoDImageROI.addScaleHandle([0.5, 0.0], [0.5, 1.0], index=0)
        self.twoDImageROI.addScaleHandle([0.5, 1.0], [0.5, 0.0], index=1)
        self.twoDImageROI.addScaleHandle([1.0, 0.5], [0.5, 0.5])
        self.twoDImageROI.addScaleHandle([0.0, 0.5], [0.5, 0.5])

        self.twoDOCMImage = pg.ImageItem(border='c')
        self.twoDOCMImage.setParentItem(self.plotArea)

        self.plotArea.addItem(self.twoDOCMImage)
        self.plotArea.addItem(self.twoDImageROI)

        zeroImage = np.zeros(self.imageWidth * self.imageHardLimitDepth)\
            .reshape((self.imageWidth, self.imageHardLimitDepth))
        self.twoDOCMImage.setImage(zeroImage)
        startingRect = QRect(0, self.imageHardLimitTop,
                             self.imageWidth, self.imageHardLimitDepth)
        self.twoDOCMImage.setRect(startingRect)

    def imageROIChanged(self):
        x, top = self.twoDImageROI.pos()
        top = int(round(top, 0))

        w, h = self.twoDImageROI.size()
        h = int(round(h, 0))

        bot = top + h - 1

        self.shallowestPixel = top
        self.deepestPixel = bot

        self.updateLinearRegion()

    def updateLinearRegion(self):
        x, top = self.twoDImageROI.pos()
        top = int(round(top, 0))

        w, h = self.twoDImageROI.size()
        h = int(round(h, 0))

        bot = top + h - 1

        self.shadedTopRegion.setRegion([self.imageHardLimitTop, top])
        self.shadedBottomRegion.setRegion([bot, self.imageHardLimitBottom+1])


if __name__ == '__main__':

    app = QApplication(sys.argv)
    main_window = TestROI()
    main_window.show()
    sys.exit(app.exec_())
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-19 19:04:43

我相信你正在谈论的问题是,在上下移动ROI时,从左到右的1px摆动。这一影响是由于实际ROI位置转换为图X,Y值。总会有四舍五入的,因此ROI总是会左右摆动。

为了防止这种情况,您可以手动设置ROI的常量x位置。为此,您必须重写ROI类的setPos。

下面是您可以使用的ROI类示例:

代码语言:javascript
复制
class ConstantXROI(ROI):
    constant_x = 0

    def setPos(self, pos, y=None, update=True, finish=True):
        pos.setX(self.constant_x)
        super().setPos(pos, y=y, update=update, finish=finish)

然后在您的代码中,只需使用:

代码语言:javascript
复制
self.twoDImageROI = ConstantXROI(...)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71178150

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档