处理2D矩形嵌套。需要找到材料的利用率。假设我有每个矩形的长度,宽度,左下角位置。确定边界切割利用率的最佳方法是什么?
目标: - 在红线下找到AREA。
附上的示例图像描绘了我所做的和我需要的东西。
我做了什么
我需要什么
另一个带有余量的矩形示例图像
答案 0 :(得分:1)
如果您对确定红线下面的总“区域”感兴趣,我有一个建议是,如果您可以访问图像处理工具箱,只需创建一个二进制图像,我们在图像上绘制所有矩形立即填充所有孔,然后确定区域,只需确定图像中所有二进制“像素”的总和。你说你有每个矩形左下角的(x,y)
位置,以及每个矩形的宽度和高度。为了使其在图像上下文中兼容,y
轴通常会被翻转,以便空间的左上角是原点而不是左下角。但是,这不应该影响我们的分析,因为我们只是向下反射整个2D空间。
因此,我将从一个与您正在处理的网格大小相同的空白图像开始,然后编写一个循环,为您拥有的每个矩形设置一个矩形坐标网格true
。之后,使用imfill
填充图像中的任何孔,然后计算获得该区域的像素总和。图像处理上下文中的孔的定义是完全被白色像素包围的任何黑色像素。因此,如果我们有白色像素包围的间隙,这些将填充白色。
因此,假设我们有x
,y
,width
和height
这四个N
元素长的单独变量,其中{{1你拥有的矩形数量是这样的:
N
N = numel(x); %// Determine total number of rectangles
rows = 100; cols = 200; %// Define dimensions of grid here
im = false(rows, cols); %// Declare blank image
%// For each rectangle we have...
for idx = 1 : N
%// Set interior of rectangle at location all to true
im(y(idx)+1:y(idx)+height(idx), x(idx)+1:x(idx)+width(idx)) = true;
end
%// Fill in the holes
im_filled = imfill(im, 'holes');
%// Determine total area
ar = sum(im_filled(:));
循环中的索引:
for
处理有点棘手。请记住,我假设im(y(idx)+1:y(idx)+height(idx), x(idx)+1:x(idx)+width(idx)) = true;
访问图像的行,y
访问列。我还假设x
和x
从0开始,因此原点位于y
。因为我们从1开始访问MATLAB中的数组和矩阵,所以我们需要将坐标偏移1.现在,行的起始索引从(0,0)
开始。我们以y(idx)+1
结束,因为我们从技术上开始y(idx) + height(idx)
,但我们需要上升到y(idx)+1
,但是当坐标从0开始时我们也减1,例如一条线宽度为20,从height(idx)
到x = 0
。这个宽度是20,但我们从0开始,直到x = 19
为19,因为MATLAB的索引从1开始,由于0索引而减1,因此+1和-1取消这就是我们刚刚离开20-1
的原因。 y(idx) + height(idx)
坐标和x
。
一旦我们绘制了图像中的所有矩形,我们使用width
来填充孔,然后我们可以通过将整个图像展开到单个向量并调用{{1}来总结总面积}}。这应该(希望)得到你需要的东西。
现在,如果你想找到没有填充孔的区域(我怀疑这是你真正需要的),那么你可以跳过imfill
步骤。只需在sum
上应用imfill
,而不是sum
,等等:
im
这将总结图像中的所有“白色”像素,这实际上是区域。我不确定你实际上是在追求什么,所以根据你的需要使用其中一种。
答案 1 :(得分:0)