处理二维矩形嵌套。需要找到材料的利用率百分比。假设我有每个矩形的长度、宽度、左下位置。确定边界切割利用率的最佳方法是什么?
目标:- 找到红线下的区域。
附上的示例图像描述了我做了什么以及我需要什么。
我做了什么
我需要的
另一个填充有余量的矩形示例图像
处理二维矩形嵌套。需要找到材料的利用率百分比。假设我有每个矩形的长度、宽度、左下位置。确定边界切割利用率的最佳方法是什么?
目标:- 找到红线下的区域。
附上的示例图像描述了我做了什么以及我需要什么。
我做了什么
我需要的
另一个填充有余量的矩形示例图像
如果您有兴趣确定红线下方的总“面积”,我的一个建议是,如果您可以访问图像处理工具箱,只需创建一个二进制图像,我们一次在图像上绘制所有矩形,填充所有的孔,然后确定面积,只需确定图像中所有二进制“像素”的总和。你说你有(x,y)
每个矩形左下角的位置,以及每个矩形的宽度和高度。为了使其在图像上下文中兼容,y
通常会翻转轴,以便空间的左上角是原点而不是左下角。但是,这不应该影响我们的分析,因为我们只是向下反映了整个 2D 空间。
因此,我将从一个与您正在处理的网格大小相同的空白图像开始,然后编写一个循环,true
为您拥有的每个矩形简单地设置一个矩形坐标网格。之后,使用imfill
填充图像中的任何一个洞,然后计算像素的总和得到面积。图像处理上下文中孔洞的定义是完全被白色像素包围的任何黑色像素。因此,如果我们有被白色像素包围的间隙,这些将被白色填充。
因此,假设我们有四个单独的变量x
, y
,width
并且height
是N
长元素,其中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
andy
是基于 0 的,所以原点位于(0,0)
. 因为我们在 MATLAB 中从 1 开始访问数组和矩阵,所以我们需要将坐标偏移 1。现在,行的开始索引从 开始y(idx)+1
。我们结束于,y(idx) + height(idx)
因为从技术上讲,y(idx)+1
我们需要height(idx)
从 0 开始,但随后我们也减去 1,因为您的坐标从 0 开始。例如,一条宽度为 20 的线,从x = 0
到x = 19
。这个宽度是 20,但是我们从 0 开始绘制,直到20-1
这是 19。由于 MATLAB 的索引从 1 开始,并且由于 0 索引而减去 1,+1 和 -1 取消,这就是为什么我们只剩下y(idx) + height(idx)
. x
坐标和也可以这样说width
。
一旦我们绘制了图像中的所有矩形,我们就可以用它imfill
来填充孔,然后我们可以通过将整个图像展开为单个向量并调用来总结总面积sum
。这应该(希望)得到你所需要的。
现在,如果你想找到没有填充孔的区域(我怀疑这是你真正需要的),那么你可以跳过这imfill
一步。只需sum
在im
, 而不是 ,上应用im_filled
, 等等:
ar = sum(im(:));
这将总结图像中的所有“白色”像素,这实际上是该区域。我不确定您实际追求的是什么,因此请根据您的需要使用其中一种。