n * n块和多边形

时间:2010-06-03 17:58:33

标签: matlab

这实际上是指在matlab中称为roipoly的函数,但它可以被认为是一般情况下的问题。

Roipoly是一个函数,它允许您在图像上选择多边形,并返回二进制掩码,您可以使用它来获取所需多边形的索引。 (毕竟它只是一个普通的多边形。)

我的应用程序(K-Nearest Neighbor)要求我从我拥有的数据(多边形)中生成n n个块,即如果我有一个多边形(道路或一块土地),我想要一个 n方形在其上移动,同时避免与边相交并将这些n * n像素放入某个变量中。

如果我的所有形状都是矩形,这个问题会容易得多,但遗憾的是并非如此。我可能会有一些对角线,圆形或不规则的东西。

我可以实现一个已知的算法吗?或者已经做过这样的事情或者可以在matlab中更容易吗?

我已经在努力了,但它非常棘手,我想确保我不会浪费时间在某个地方重新发明轮子。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我不完全确定你想要什么,但我们假设它是这样的:你有一个二元模板,你想要所有(可能重叠的)n * n方格适合。

您可以通过生成所有可能的n * n方块然后丢弃所有不适合多边形的方块来尝试此操作。

例如

%# create a circle - this is the binary mask
bw = false(101);
[xx,yy] = ndgrid(-50:50,-50:50);
bw((xx.^2+yy.^2)<625)=true;

%# since we'd want to know which windows fit, we'll collect the linear indices
%# pointing into bw. Thus, we need an array of the same size as bw that contains
%# the linear index of each pixel
indexMask = zeros(size(bw));
indexMask(:) = 1:numel(indexMask);

%# create all possible 5*5 windows with im2col. 
allWindows = im2col(indexMask,[5,5]);

%# discard all windows that lay even partially outside the mask
goodWindowIdx = all(bw(allWindows),1);

goodWindows = allWindows(:,goodWindowIdx);

goodWindows中的每一列都列出了对应于完全位于多边形内部的5 * 5蒙版的一个位置的索引(在我的例子中为圆圈)。