1

我需要从图像中提取对象。我知道对象在图像内的位置,即对象所在的区域:该区域以一对坐标[xmin, ymin][xmax, ymax]的形式提供。

我想修改这个区域的坐标(从而以合适的方式增加高度和宽度),以便提取具有指定纵横比的子图像。因此,我们有以下约束:

  1. 为避免错误切割物体,区域的宽度和高度不得减少;
  2. 边界检查:区域大小的适配必须保证新坐标在图像内部;
  3. 子图像的宽/高比应该大约等于指定的纵横比。

如何解决这个问题呢?

更新:一种可能的解决方案

我的问题的解决方案主要是Mark在this answer中提出的算法。该算法的结果是一个比原始区域更宽或更高的新区域,并且能够获得非常接近指定的新纵横比,而无需移动原始区域的中心(如果可行,取决于原始图像中的区域)。从该算法得到的区域可以通过以下算法进一步处理,以使纵横比更接近指定的纵横比。

for left=0:(xmin-1),                      // it tries all possible combinations
    for right=0:(imgWidth-xmax),          // of increments of the region size
        for top=0:(ymin-1),               // along the four directions
            for bottom=0:(imgHeight-ymax),
                x1 = xmin - left;
                x2 = xmax + right;
                y1 = ymin - top;
                y2 = ymax + bottom;

                newRatio = (x2 - x1) / (y2 - y1);

                if (newRatio == ratio)
                    rect = [x1 y1 x2 y2];
                    return;
                end
            end
        end
    end
end

示例... 976 行 1239 列的图像;初始区域 [xmin ymin xmax ymax] = [570 174 959 957]。

第一种算法(主要处理)。

  • 输入:初始区域和图像大小。
  • 输出:它产生新的区域 r1 = [568 174 960 957],宽度 = 392 和高度 = 783,所以纵横比等于 0.5006。

第二种算法(后处理)。

  • 输入:区域 r1。
  • 输出:新区域 r2 = [568 174 960 958],宽度 = 392,高度 = 784,因此纵横比等于 0.5。
4

2 回答 2

2
obj_width = xmax - xmin
obj_height = ymax - ymin
if (obj_width / obj_height > ratio)
{
    height_adjustment = ((obj_width / ratio) - (ymax - ymin)) / 2;
    ymin -= height_adjustment;
    ymax += height_adjustment;
    if (ymin < 0)
    {
        ymax -= ymin;
        ymin = 0;
    }
    if (ymax >= image_height)
        ymax = image_height - 1;
}
else if (obj_width / obj_height < ratio)
{
    width_adjustment = ((obj_height * ratio) - (xmax - xmin)) / 2;
    xmin -= width_adjustment;
    xmax += width_adjustment;
    if (xmin < 0)
    {
        xmax -= xmin;
        xmin = 0;
    }
    if (xmax >= image_width)
        xmax = image_width - 1;
}
于 2013-03-11T21:22:01.427 回答
0

让我们从您的区域开始:以点p为中心的w x h矩形。您想扩展此区域以具有纵横比r。这个想法是扩展宽度或高度:

  1. (小例)如果w / h == r,则返回。
  2. 计算w' = h x r
    • 如果w' > w,则结果区域的宽度为w',高度为h,中心为p
    • 否则,结果区域的宽度为w,高度为h' = w / r,中心为p
  3. 如果必须裁剪图像,则移动中心p以跟随图像的边缘,例如,如果结果区域的左上角点在图像之外:让u = 结果区域的左上角点和d = (min ( ux ,0), min( uy ,0))。然后,最终的中心将是p' = p - d。该区域的右下部分也是如此。
  4. 将生成的区域剪辑到图像。
于 2013-03-11T21:22:17.447 回答