【问题标题】:How can I make a draggable/adjustable ROI in OpenCV/Python?如何在 OpenCV/Python 中制作可拖动/可调整的 ROI?
【发布时间】:2016-09-10 06:39:13
【问题描述】:

在对图像执行我的处理算法之前,我需要用户单击并绘制一个圆圈以使用鼠标创建一个剪贴蒙版。此蒙版将用于删除图像中会导致我的算法失败的区域。

我怎样才能允许用户:

  1. 拖动 ROI(以调整图像上的 x-y 位置)

  2. 调整 ROI 的形状(即通过拖动调整圆的大小)

将来我需要使用一些特征检测来做出 ROI 选择,但现在我真的需要用户能够以对他们来说容易的方式定义 ROI,

【问题讨论】:

    标签: python opencv image-processing user-controls


    【解决方案1】:

    如果您安装了scikit-image,您可以使用以下命令进行矩形选择(不过,将 skimage 代码修改为圆形并不难):

    import matplotlib.pyplot as plt
    from skimage import data
    from skimage.viewer.canvastools import RectangleTool
    
    f, ax = plt.subplots()
    ax.imshow(data.camera(), interpolation='nearest', cmap='gray')
    
    props = {'facecolor': '#000070',
             'edgecolor': 'white',
             'alpha': 0.3}
    rect_tool = RectangleTool(ax, rect_props=props)
    
    plt.show()
    print("Final selection:")
    rect_tool.callback_on_enter(rect_tool.extents)
    

    您按 Enter 键完成选择。

    【讨论】:

    • 对于 Mac OSX 用户:我必须更改后端 -- 添加: import matplotlib matplotlib.use('TkAgg') 只是 before import matplotlib.pyplot as plt in order摆脱 AttributeError: 'FigureCanvasMac' 对象没有属性 'restore_region'
    • 谢谢。我提出了一个问题:github.com/scikit-image/scikit-image/issues/884
    • 我收到AttributeError: 'AxesSubplot' object has no attribute 'ax' 在线rect_tool = RectangleTool(ax, rect_props=props)。 System Info: Ubuntu 20.04.4 LTS; Anaconda Environment; Python3.8.
    【解决方案2】:

    Stefan 给出的那段代码不能再被支持(当 ax 被传递给 RectangleTool 时它会失败)。 RectangleTool 仅将 skimage 查看器作为参数。这是一段改编自 Stephan 示例和 skimage documentation 的代码。它提供了一种检索 ROI 坐标的交互方式。

    from pylab import *
    from skimage import data
    from skimage.viewer.canvastools import RectangleTool
    from skimage.viewer import ImageViewer
    
    im = data.camera()
    
    def get_rect_coord(extents):
        global viewer,coord_list
        coord_list.append(extents)
    
    def get_ROI(im):
        global viewer,coord_list
    
        selecting=True
        while selecting:
            viewer = ImageViewer(im)
            coord_list = []
            rect_tool = RectangleTool(viewer, on_enter=get_rect_coord) 
            print "Draw your selections, press ENTER to validate one and close the window when you are finished"
            viewer.show()
            finished=raw_input('Is the selection correct? [y]/n: ')
            if finished!='n':
                selecting=False
        return coord_list
    
    a=get_ROI(im)
    print a
    

    【讨论】:

      猜你喜欢
      • 2011-12-19
      • 2012-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多