主要内容

子样本或简化徒手ROI

此示例显示如何进行子抽样或减少a中的点数徒手画的ROI对象。

介绍

drawfreehand函数创建一个平滑的,徒手,感兴趣的区域(ROI)。然而,ROI的边缘实际上是由分布在边界上的离散点组成的。两个因素决定了徒手ROI的平滑程度:1)点的密度和2)平滑属性。

当以交互方式绘制时,鼠标的移动决定点的密度。对于较大的复roi,所使用的点的数量可能相当大。

平滑属性控制边界的外观。默认情况下,徒手画的对象使用sigma值为1,滤波大小为5的高斯平滑核。改变这个值只会改变边界的外观,而不会改变底层位置对象的。

默认点密度

减少点的密度可以帮助减少存储ROI数据所需的空间,还可以加快任何取决于这些点数量的计算。减少点密度的一种方法是对这些点进行子抽样,例如,每隔一个点选取一个点。

通过将蒙版转换为ROI来创建徒手ROI示例。ROI非常密集,因为每个边界像素都对应于ROI中的一个点。

我= imread (“football.jpg”);bw = im (:: 1) > 200;Bw = bwareafilt(Bw, 1);集团= bwboundaries (bw,“noholes”);roipos = fliplr(集团{1});imshow (im);仁人家园= drawfreehand(分部“位置”, roipos);

为了可视化这些点的密度,将ROI中的每个点都转换为一个路径点。

hfh.Waypoints (:) = true;标题(“原来的密度”);snapnow%放大。xlim(200年[80]);ylim(160年[70]);snapnow

对位置点进行子采样

的子抽样点位置这是徒手ROI的属性。因为徒手的ROI是非常密集的。子采样可以在不降低保真度的情况下,大幅度地减小尺寸。查询初始、完整、细粒度的位置。

fpo = hfh.Position;

子样本,每选一个点。

要= fpo(1:2:最终,);

更新ROI的Position属性。

仁人家园。分部位置=手机一族;

要看到密度,把所有的点变成路点。

hfh.Waypoints (:) = true;标题(简单的子样品的);snapnow

分段抽样-使用变化率

一个更好的方法subsample点将是选择性地开始删除点有低曲率.移除ROI中相对直线部分上的一个点比移除曲线附近的一个点更有意义。定义曲率值的一个简单方法是测量位置位置的变化率。

测量变化率。第一个点的邻居是最后一个点。

dfpos = diff ([fpo(最终:);fpo]);

定义一个基于简单低通滤波器的特殊曲率测量。

Cm = sum(abs(conv2(dfpos, ones(3,2)))“相同”), 2);

通过曲率。

[~, cmInds] =排序(cm);

选择3/4的曲率值较低的点从ROI中移除。

numPointsToCull =圆(0.25 *大小(fpo, 1));

删除这些职位。

要= fpo;手机(cmInds (1: numPointsToCull ),:) = [];

更新ROI,打开所有的路径点来查看影响。

仁人家园。分部位置=手机一族;hfh.Waypoints (:) = true;标题(“基于曲率的子样本(因子4)”);snapnow

二次抽样——使用减少方法处理徒手ROI对象

对这些点进行子抽样的更好方法是使用减少方法在ROI对象上。的减少方法直接对位置属性。您可以通过指定[0 1.0]之间的容差值作为一个可选的输入参数来影响被删除的点数。默认值为0.01。

重置位置财产和调用减少在ROI对象上。

仁人家园。分部位置= fpo;减少(仁人家园能够);%查看更新后的ROI,将所有的点转换为路径点查看%的影响。hfh.Waypoints (:) = true;标题(“使用简化方法的子抽样”);snapnow

互动的二次抽样

子抽样的另一种方法是使用事件来简化这个过程。首先,创建一个侦听器来交互式地更改徒手ROI使用的点数。使用用户数据属性来缓存完整的分辨率位置数据,以及当前值的公差。然后通过创建一个新的,向ROI对象添加一个自定义上下文菜单uimenu和养育孩子UIContextMenuFreehand对象的。此菜单选项允许您完成ROI,它删除临时缓存。

恢复原始ROI,并在UserData中缓存原始位置及其曲率度量。

hfh.Waypoints (:) = true;hfh.UserData.fpos = fpo;hfh.UserData.tol = 0;

响应鼠标滚动。

h = gcf;h. windowscrollwheelfcn = @(h, evt) changeSampleDensity(hfh, evt);

添加上下文菜单以确定ROI并执行任何需要的清理。

uimenu(仁人家园能够。UIContextMenu,“文本”“完成”...“MenuSelectedFcn”@(变长度输入宗量)完成(仁人家园)分部);标题(“滚动来交互改变密度”);

动画的互动子采样

回调函数-改变样本密度基于鼠标滚动

这个函数在滚动动作时被调用。向上滚动会增加密度,向下滚动会降低密度。这允许您交互式地选择要保留的点数。

函数changeSampleDensity(仁人家园,分部evt)%恢复ROI的位置属性。仁人家园。分部位置= hfh.UserData.fpos;%根据滚动条的方向改变固定的公差。这段代码将每次滚动增量的公差改变0.01。if (evt.VerticalScrollCount) = 1 * (evt.VerticalScrollCount);%将公差值的范围限制在0到0.15之间,即%有用的范围。Tol = max(min(Tol, 0.15), 0);%调用|以指定的公差减少|。减少(仁人家园,分部tol);hfh.UserData.tol =托尔;%更新ROI,并将所有的点转换为路径点,以显示%的密度。hfh.Waypoints (:) = true;结束

回调函数-完成徒手投资回报率

删除并创建一个新的带有下采样点的徒手ROI,以节省空间。

函数Finalize (hfh) h =祖宗(hfh,“图”);重置鼠标滚轮回调。h.WindowScrollWheelFcn = [];保存最后的积分。pos = hfh.Position;删除并创建一个新的Freehand ROI和新的|位置|值。删除(仁人家园能够);drawfreehand (gca),“位置”、pos);结束

另请参阅

|||

相关的话题