Matlab n*n块和多边形

Matlab n*n块和多边形,matlab,Matlab,这实际上是针对matlab中名为roipoly的函数,但它可以被视为一般情况下的问题 Roipoly是一个函数,它允许您在图像上选择多边形,并返回一个二进制掩码,您可以使用该掩码获取所需多边形的索引。(它毕竟只是一个法线多边形) 我的应用程序(K-最近邻)要求我用我拥有的数据(多边形)制作nn块,也就是说,如果我有一个多边形(一条道路或一块土地),我希望nn正方形在其上移动,同时避免与边相交,并将这些n*n像素放入某个变量中 如果我所有的形状都是矩形的话,这个问题会容易得多,但不幸的是,事实并非

这实际上是针对matlab中名为roipoly的函数,但它可以被视为一般情况下的问题

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

我的应用程序(K-最近邻)要求我用我拥有的数据(多边形)制作nn块,也就是说,如果我有一个多边形(一条道路或一块土地),我希望nn正方形在其上移动,同时避免与边相交,并将这些n*n像素放入某个变量中

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

有一个已知的算法我可以实现吗?或者一些已经做到了这一点,或者可以在matlab中使其变得更容易的东西

我已经在做了,但它相当棘手,我想确保我没有浪费时间在某个地方重新发明一个轮子


有什么想法吗?

我不完全确定您想要什么,但假设是这样的:您有一个二进制掩码,并且您想要所有(可能重叠的)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);
%#创建一个圆-这是二进制掩码
bw=false(101);
[xx,yy]=ndgrid(-50:50,-50:50);

bw((xx.^2+yy.^2)我不完全确定您想要什么,但假设是这样的:您有一个二进制掩码,并且您想要所有(可能重叠的)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);
%#创建一个圆-这是二进制掩码
bw=false(101);
[xx,yy]=ndgrid(-50:50,-50:50);

体重((xx.^2+yy.^2)编辑,谢谢你的评论,我在早些时候写问题时有点迷路了。编辑,谢谢你的评论,我在早些时候写问题时有点迷路了。天哪!天才!这正是我一整天都在努力实现的!我不知道im2col-->但我已经为我的矩形数据实现了它。我知道我是重新发明轮子。真的,你不知道我有多感激!很高兴帮助你。而且,你接受了我的答案,所以我也很感激:)天哪!天才!这正是我一整天都在努力实现的!我不知道im2col-->但我已经为我的矩形数据实现了它。我知道我在重新发明轮子。真的,你不知道我有多感激!很高兴帮助你。而且,你接受了我的答案,所以我也很感激:)