子样本或简化徒手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
UIContextMenu
Freehand对象的。此菜单选项允许您完成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);结束
另请参阅
bwareafilt
|bwboundaries
|drawfreehand
|徒手画的