使用指定的宽高比提取子图像

时间:2013-03-11 21:05:33

标签: c++ python algorithm matlab image-processing

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

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

  1. 为了避免错误地切割物体,不得减小该区域的宽度和高度;
  2. 边界检查:区域大小的调整必须确保新坐标位于图像内;
  3. 子图像的宽度/高度比率应大致等于指定的宽高比。
  4. 如何解决这个问题?

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

    我的问题的解决方案主要是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], width = 392和height = 783,因此纵横比等于0.5006。

    第二种算法(后期处理)。

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

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

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

  1. (琐碎的情况)如果 w / h == r ,则返回。
  2. 计算 w&#39; = h x r
    • 如果 w&#39; &gt; w ,然后生成的区域宽度 w&#39; ,高度 h 和中心 p
    • 否则,生成的区域宽度 w ,高度 h&#39; = w / r ,和中心 p
  3. 移动中心 p 以跟随图像边缘(如果必须剪裁),例如,如果结果区域左上角位于图像之外:let u < / em> =结果区域的左上角和 d =(min( ux ,0),min( uy ,0) )。然后,最终中心将是 p&#39; = p - d 。该区域的右下部分类似。
  4. 将生成的区域剪切为图像。