下面的方法效果很好,运行速度也很快。它有一些嵌套循环,但您可能可以进一步优化性能,我主要只是想让它为您工作。但请记住,如果您注释掉 fprintf() 和绘图命令,将会加快速度。
我从您的 Stack 帖子中下载了您的图片,但我认为我下载的版本与您正在使用的原始数据具有不同的大小 (398x398),因此在查看下面的结果时请记住这一点。
如代码中所示,您提供宽度 (w) 和高度 (h),然后算法返回矩形可以适合的所有 (col, row) 位置。
旁注: 我相信这为Bin packing problem 的 2D 版本提供了解决方案,但我不确定,如果是这样,您可以查看上面的链接您感兴趣。
无论哪种方式,它都是一个很好的计算问题示例,可以相当快地进行穷举搜索。
为了验证结果,我添加了简单的矩形绘图。请记住,如果矩形适合多个位置,则多个矩形的图开始看起来相当混乱,因为它们被反复绘制在另一个之上(带有偏移)。
作为仅找到单个矩形的示例,我使用: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),您只需在交换宽度和高度后重复搜索即可。
希望这会有所帮助。