是否有一种方法可以交互式地选择感兴趣区域(ROI),然后在python上返回其位置

wz3gfoph  于 2023-02-02  发布在  Python
关注(0)|答案(1)|浏览(128)

我有一个CT图像数组,我希望能够在图上选择感兴趣的区域,然后返回边界框矩形/正方形的位置,基本上是矩形/正方形的起点和终点,然后我将裁剪数据py位置:剪辑w =新数据[:,y1:y2,x1:x2]。
我尝试使用破折号应用程序,如这里所示:https://dash.plotly.com/annotations它通过回调函数返回形状的特性,这很有用,但我必须自己复制和粘贴位置。我找不到一种方法使它自动将poition列表传递到下一步(clipw)。我使用的是Jupyter notebook。

f87krz0w

f87krz0w1#

如果你打算在Jupyter笔记本上运行Dash应用程序,你可能会想使用JupyterDash。要从感兴趣的区域选择坐标,你链接的文档页面上有一个例子,显示了关于绘制形状的所有信息,包括坐标。
下面是一个JupyterDash应用程序的例子,它可以完全在你的Jupyter笔记本上运行,它通过将浮点x,y坐标四舍五入为整数来选择你的图像的最接近的索引。这依赖于图像的形状是(900,1600,3),并且默认情况下将x轴和y轴设置为相同的比例。
目前,除了返回所选矩形角的最接近的x,y索引外,该应用程序没有太多功能,但希望您可以修改该功能的其余部分,以适应您的裁剪用例。

import plotly.express as px
from jupyter_dash import JupyterDash
from dash import Dash, dcc, html, Input, Output, no_update
from skimage import io 
import json

img = io.imread('https://raw.githubusercontent.com/michaelbabyn/plot_data/master/bridge.jpg')
fig = px.imshow(img)
fig.update_layout(dragmode="drawrect")

app = JupyterDash(__name__)
app.layout = html.Div(
    [
        html.H3("Drag and draw rectangle annotations"),
        dcc.Graph(id="graph-picture", figure=fig),
        dcc.Markdown("Characteristics of shapes"),
        html.Pre(id="annotations-data"),
    ]
)

@app.callback(
    Output("annotations-data", "children"),
    Input("graph-picture", "relayoutData"),
    prevent_initial_call=True,
)
def on_new_annotation(relayout_data):
    if "shapes" in relayout_data:
        shape_dict = relayout_data["shapes"][0]
        x0, x1, y0, y1 = shape_dict["x0"], shape_dict["x1"], shape_dict["y0"], shape_dict["y1"]
        [x0, x1, y0, y1] = [round(num) for num in [x0, x1, y0, y1]]
        ## crop data
        return f"x0={x0}, x1={x1}, y0={y0}, y0={y1}"
    else:
        return no_update

app.run_server(mode='inline')

相关问题