我有一个二值图像:
我想看看一个100x150长方形是否适合地图上的任何空格。我试着创建一个长方形条纹,然后侵蚀和扩展图片,以去除任何比需要小的区域:
se = strel('rectangle',[150, 100]);
BW = imerode(BW,se);
BW = imdilate(BW,se);
不幸的是,它过早地发现了一个洞。
只有80x150。我认为侵蚀是失败的,因为它是对墙&只需要一半的宽度,但不知道如何修复它。
另外,如果我走错了路,请让我直截了当。最终,我只需要找到一个空格的左上角至少有100x150大小。
发布于 2014-01-02 17:19:04
下面的方法工作得很好,运行得相当快。它有几个嵌套循环,但是您可能可以进一步优化性能,我主要想让它为您工作。不过,请记住,如果您注释掉了fprintf()
和绘图命令,这将加快速度。
我从您的Stack帖子下载了您的图像,但是我相信我下载的版本的大小(398x398)与您正在处理的原始数据不同,所以在查看下面的结果时请记住这一点。
如代码所示,您提供了宽度(w)和高度(h),然后算法返回矩形可以适合的所有(col,行)位置。
侧注:--我相信这为2D版本的http://en.wikipedia.org/wiki/Bin_packing_problem提供了一个解决方案,但我不确定,如果您感兴趣的话,可以查看上面的链接。
无论哪种方式,它都是计算问题的一个很好的例子,在这种情况下,彻底的搜索可以很快地执行。
为了验证结果,我添加了矩形的简单绘图。请记住,如果矩形位于多个位置,则多个矩形的图形开始显得非常混乱,因为它们被反复绘制在另一个位置上(带有偏移)。
例如,在只找到一个矩形的情况下,我使用:w = 29; h = 102;
,然后结果显示,这个特定矩形唯一适合的位置是左上角= (row = 295, col = 368)
(这个矩形大小很可能只适用于我下载的数据版本):
总之,我首先加载数据,然后转换为二进制映射(0和1):
% Note: '0' = black; '1' = white
data = round(im2double(rgb2gray(imread(filepath))));
figure(1);imshow(data); set(gcf,'Color',[1 1 1]);
hold on;
输入搜索宽度和高度:
w = 29;
h = 102;
sze = size(data);
numRows = sze(1);
numCols = sze(2);
接下来,我们只需进行搜索,看看哪些位置适合每一行和每一个位置:
for col = 1:numCols - w - 1
for row = 1:numRows - h - 1
doesFit = fitshere(data, row,col, w, h);
if (doesFit == 1)
fprintf('row = %d; col = %d \n',row,col);
colX = [col col+w col+w col col];
colY = [row row row+h row+h row];
line(colX,colY,'Color','r','linewidth',2);
end
end
end
hold off;
您将需要以下函数来检查给定的矩形是否适合数组:
function [val] = fitshere(data, row, col, w, h)
val = 1;
for i = col:col + w
for j = row:row + h
if (data(j,i) == 0) % if this is true, we are in the black!
val = 0;
return;
end
end
end
return;
如果您有兴趣知道您的矩形是否适合(例如width X height
或height X width
),您只需在交换宽度和高度之后重复搜索即可。
希望这能有所帮助。
发布于 2014-01-03 07:40:19
让我们用一些matlab成语来做这件事。
M=binaryImage;
sz=size(M);
nrows = 100;
ncols = 150 ;
colsum = cumsum(M,1);
cols_are_good = colsum(nrows+1:end,:)-colsum(1:end-nrows+1,:)==0;
% nrows empty rows below this point. in this column
rows_are_also_good = cols_are_good(:,ncols+1:end)-cols_are_good(:,1:end+1-ncols)==0;
鲍勃是你的叔叔,最后一个变量在所有地方都包含了一个,在它们下面有一行,每个地方旁边都有ncols。
https://stackoverflow.com/questions/20892372
复制相似问题