【问题标题】:How to determine Boundary Cut Utilization MATLAB?如何确定边界切割利用率 MATLAB?
【发布时间】:2015-03-22 06:10:24
【问题描述】:

处理二维矩形嵌套。需要找到材料的利用率百分比。假设我有每个矩形的长度、宽度、左下位置。确定边界切割利用率的最佳方法是什么?

目标:- 找到红线下的区域。

附上的示例图片描述了我做了什么以及我需要什么。

我做了什么

我需要什么

另一个填充有余量的矩形示例图像

【问题讨论】:

  • 我可能会将所有这些矩形放在二值图像中,然后使用边界跟踪算法跟踪边界。关于算法,你能有多灵活?我们可以使用……比如说……图像处理工具箱吗?如果可以,那么通过逻辑索引和bwperim 的组合,您可以非常轻松地获得所需的内容。
  • 不熟悉图像图像处理工具箱。但是如果你使用 bwperim,它不会也给出内孔的周长吗?您能否进一步解释一下,也许用代码?我是matlab的初学者@rayryeng​​span>
  • 我没有注意到的漏洞。您可以简单地使用imfill 填充孔,然后使用bwperim 提取外边缘。你是对的,如果我们直接使用bwperim,它会得到孔的周长,所以最好先使用imfill 填充孔。你有这个工具箱吗?我当然可以进一步解释,但我需要知道你是如何存储这些矩形的。您能否提供您为生成上图而编写的任何代码?如果我没有它,对我来说会更加困难,因为我不知道你是如何表示这些矩形的。
  • 或者更好的是,我们甚至不需要图像处理工具箱。没有那个我可以做到...但我仍然需要知道这些矩形是存储的。
  • 矩形存储为每个矩形左下角的 x,y 位置。我在另一个变量中有相应的长度、宽度值。顺便说一句,我对红线下的区域而不是周长感兴趣。我有 IP 工具箱,但我对此知之甚少。

标签: matlab optimization nested bin-packing utilization


【解决方案1】:

如果您有兴趣确定红线下方的总“面积”,我的一个建议是,如果您可以访问图像处理工具箱,只需创建一个二进制图像,我们在图像上绘制所有矩形一次,填充所有的洞,然后确定面积,只需确定图像中所有二进制“像素”的总和。你说你有每个矩形左下角的(x,y) 位置,以及每个矩形的宽度和高度。为了使其在图像上下文中兼容,y 轴通常被翻转,以便空间的左上角是原点而不是左下角。但是,这不应该影响我们的分析,因为我们只是向下反映了整个 2D 空间。

因此,我将从一个与您正在处理的网格大小相同的空白图像开始,然后编写一个循环,为您拥有的每个矩形简单地设置一个矩形坐标网格为true。之后,使用imfill填充图像中的任何一个洞,然后计算像素的总和得到面积。图像处理上下文中空洞的定义是完全被白色像素包围的任何黑色像素。因此,如果我们有被白色像素包围的间隙,这些将被白色填充。

因此,假设我们有四个单独的变量 xywidthheight,它们的长度为 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 访问列。我还假设xy 是从0 开始的,所以原点在(0,0)。因为我们在 MATLAB 中从 1 开始访问数组和矩阵,所以我们需要将坐标偏移 1。现在,行的开始索引从 y(idx)+1 开始。我们以y(idx) + height(idx) 结束,因为从技术上讲,我们从y(idx)+1 开始,但随后我们需要上升到height(idx),但随后我们也减去1,因为您的坐标从0 开始。以宽度为20 的线为例,从x = 0x = 19。这个宽度是 20,但我们从 0 开始绘制,直到 20-1,即 19。由于 MATLAB 的索引从 1 开始,并且由于 0 索引而减去 1,所以 +1 和 -1 取消,这这就是为什么我们只剩下y(idx) + height(idx)x 坐标和width 也可以这样说。

绘制完图像中的所有矩形后,我们使用imfill 填充孔洞,然后我们可以通过将整个图像展开为单个向量并调用sum 来总结总面积。这应该(希望)得到你所需要的。


现在,如果您想找到没有填充孔的区域(我怀疑这是您真正需要的),那么您可以跳过imfill 步骤。只需在im 上应用sum,而不是im_filled,这样:

ar = sum(im(:));

这将汇总图像中的所有“白色”像素,这实际上是该区域。我不确定您实际追求的是什么,因此请根据您的需要使用其中一种。

【讨论】:

  • 我实际上需要一个有填充孔的。如果我想要没有填充孔,显然我会总结各个矩形的面积。顺便说一句,这是一个很好的解决方案。 +1
  • 虽然我知道这会做我的工作,如果你能想出不涉及创建图像的替代答案,请发布它。因为我需要计算每次迭代的利用率百分比,比如大约 80000。我认为创建图像和进行图像处理技巧会减慢我的实际过程。
  • 你能概括一下其他凸多边形的代码吗?假设我们有每个多边形顶点的 X、Y 向量。使用Image processing toolbox 可以做到这一点吗?
  • 对于矩形,我有一个没有 IPT 的想法,但我现在已经很晚了,我需要睡觉了。我起床后会写点东西。对于一般多边形,这将更加困难。我可能仍会使用 IPT,但需要进行更多处理。我可以为矩形提供解决方案,但对于多边形则另当别论。
  • 顺便说一句,感谢您接受我的回答,尽管它还不是很完整。明天我将添加如何在没有 IPT 的情况下执行此操作。
【解决方案2】:

边界切割区域,不使用Image Processing Toolbox

详细的问题描述和答案可以在here找到

此解决方案仅适用于矩形零件。

【讨论】:

  • 如果有人也可以推广其他凸多边形的解决方案,请分享。我会将其标记为 Answer
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多