计算包含指定矩形的最小矩形

需求背景

点击窗口放大时,放大到最小参考线矩形,如下图:
image.png
image.png

代码实现

interface Rectangle {
    x: number;     // 矩形左上角的 x 坐标
    y: number;     // 矩形左上角的 y 坐标
    width: number; // 矩形的宽度
    height: number; // 矩形的高度
}

/**
 * 根据给定的坐标和尺寸,计算包含该矩形的最小矩形。
 * @param xList - x 轴坐标数组,按升序排列。
 * @param yList - y 轴坐标数组,按升序排列。
 * @param x - 给定矩形的左上角 x 坐标。
 * @param y - 给定矩形的左上角 y 坐标。
 * @param width - 给定矩形的宽度。
 * @param height - 给定矩形的高度。
 * @returns 包含指定矩形的最小矩形的 x、y、宽度和高度。
 * @throws 如果无法找到包含给定矩形的最小矩形,抛出错误。
 */
function findBoundingRectangle(
    xList: number[], 
    yList: number[], 
    x: number, 
    y: number, 
    width: number, 
    height: number
): Rectangle {
    // 计算给定矩形的右边界和下边界
    const rectRight: number = x + width;
    const rectBottom: number = y + height;

    // 找到左边界的 x 坐标(即最接近且小于或等于 x 的坐标)
    const leftX: number | null = xList.filter((hx: number) => hx <= x).pop() ?? null;
    // 找到右边界的 x 坐标(即最接近且大于或等于 rectRight 的坐标)
    const rightX: number | null = xList.find((hx: number) => hx >= rectRight) ?? null;

    // 找到上边界的 y 坐标(即最接近且小于或等于 y 的坐标)
    const upperY: number | null = yList.filter((vy: number) => vy <= y).pop() ?? null;
    // 找到下边界的 y 坐标(即最接近且大于或等于 rectBottom 的坐标)
    const lowerY: number | null = yList.find((vy: number) => vy >= rectBottom) ?? null;

    // 如果找不到任何边界点,则抛出错误
    if (leftX === null || rightX === null || upperY === null || lowerY === null) {
        throw new Error("无法找到包含指定矩形的矩形");
    }

    // 计算包含矩形的最小矩形的宽度和高度
    const newWidth: number = rightX - leftX;
    const newHeight: number = lowerY - upperY;
    
    // 返回包含指定矩形的最小矩形的坐标和尺寸
    return { x: leftX, y: upperY, width: newWidth, height: newHeight };
}

// 示例
const xList: number[] = [1, 3, 5, 7, 9];
const yList: number[] = [2, 4, 6, 8, 10];
const x: number = 4;
const y: number = 5;
const width: number = 2;
const height: number = 3;

const boundingRectangle = findBoundingRectangle(xList, yList, x, y, width, height);
console.log("左上点 x:", boundingRectangle.x);
console.log("左上点 y:", boundingRectangle.y);
console.log("宽度:", boundingRectangle.width);
console.log("高度:", boundingRectangle.height);

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Matlab中,我们可以使用regionprops函数计算二值图像中的最小外接矩形。以下是示例代码: ```matlab % 读入二值图像 binaryImage = imread('image.png'); % 计算二值图像的最小外接矩形 props = regionprops(binaryImage, 'BoundingBox'); % 绘制最小外接矩形 figure; imshow(binaryImage); hold on; rectangle('Position', props.BoundingBox, 'EdgeColor', 'r', 'LineWidth', 2); ``` 解释: 1. 首先,我们使用imread函数读入二值图像。 2. 然后,我们使用regionprops函数计算二值图像的最小外接矩形。函数的第一个参数是输入二值图像,第二个参数是需要计算的属性,这里我们只计算BoundingBox属性,即最小外接矩形。 3. 最后,我们使用imshow函数显示二值图像,并使用rectangle函数绘制最小外接矩形。函数的第一个参数是矩形的位置,即BoundingBox属性的值。第二个参数是矩形边框的颜色,这里我们使用红色。第三个参数是矩形边框的宽度,这里我们使用2个像素。 注意:在计算最小外接矩形之前,需要确保二值图像中只有一个物体。如果有多个物体,需要使用bwlabel函数标记每个物体,然后对每个物体分别计算最小外接矩形。此外,如果二值图像中包含噪点,需要使用bwareaopen函数去除面积较小的噪点。 ### 回答2: 手势二值图外接最小矩形的求解可以使用MATLAB中的函数regionprops来实现。具体的代码如下: ```matlab % 读取手势二值图像 binary_image = imread('gesture_image.png'); % 使用bwlabel函数将图像中的连通区域分别标记 labeled_image = bwlabel(binary_image); % 使用regionprops函数获取图像中的连通区域属性 region_props = regionprops(labeled_image, 'BoundingBox'); % 提取所有连通区域的外接矩形框 bounding_boxes = cat(1, region_props.BoundingBox); % 绘制最小外接矩形框 figure; imshow(binary_image); hold on; for i = 1:numel(region_props) rectangle('Position', bounding_boxes(i,:), 'EdgeColor', 'r','LineWidth', 2); end hold off; ``` 上述代码首先读取了手势二值图像,然后使用bwlabel函数对图像中的连通区域进行标记。接着,使用regionprops函数获取图像中的连通区域属性,其中参数'BoundingBox'表示要获取外接矩形框的信息。然后,将所有连通区域的外接矩形框提取出来,并使用rectangle函数在原图上绘制出这些矩形框。 解释代码的功能如下: 1. 读取手势二值图像。 2. 使用bwlabel函数对图像中的连通区域进行标记,生成标记图像。 3. 使用regionprops函数获取标记图像中的连通区域属性,其中参数'BoundingBox'表示要获取外接矩形框的信息。 4. 将所有连通区域的外接矩形框提取出来,并存储在bounding_boxes变量中。 5. 绘制最小外接矩形框,使用rectangle函数在原图上绘制出这些矩形框。 ### 回答3: 要求解手势二值图的最小外接矩形,可以使用以下步骤: 1. 首先,读取手势的二值图像。假设图像已经在MATLAB中以矩阵形式加载,命名为binary_image。 2. 使用regionprops函数计算二值图像的连通区域属性。这个函数会返回每个连通区域的一系列属性,包括区域的面积、中心点等。 3. 根据手势区域的连通区域属性,找到最大的区域(手势区域)。利用regionprops返回的数据,可以使用代码`stats = regionprops(binary_image, 'BoundingBox');`来获取手势区域的最小外接矩形的边界框。 4. 最后,使用Matlab的绘图函数将边界框绘制在原始图像上。可以使用代码`imshow(binary_image); hold on; rectangle('Position', stats.BoundingBox, 'EdgeColor', 'r'); hold off;`将外接矩形框绘制在二值图像上。 解释代码: - 第一步是读取手势的二值图像,将图像加载到MATLAB中。 - 第二步使用regionprops函数计算二值图像的连通区域属性,返回每个连通区域的一系列属性。通过设置参数'BoundingBox',可以返回每个区域的最小外接矩形框。 - 在第三步,我们选择最大的连通区域(手势区域)进行处理。通过regionprops函数返回的数据,我们可以获取手势区域的最小外接矩形框的位置和尺寸。 - 最后一步就是使用MATLAB的绘图函数将外接矩形绘制在原始图像上。我们使用imshow函数显示二值图像,然后使用rectangle函数在图像上绘制边界框。指定位置参数为stats.BoundingBox将最小外接矩形的位置和尺寸传递给rectangle函数,然后指定边界框的颜色。 通过上面的步骤和代码,我们可以求解手势二值图的最小外接矩形,并将其在MATLAB中可视化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值