1

画像からオブジェクトを抽出する必要があります。画像内のオブジェクトの位置、つまりオブジェクトが配置されている領域を知っています。この領域は、座標[xmin, ymin][xmax, ymax]のペアとして提供されます。

指定された縦横比でサブイメージを抽出するために、この領域の座標を変更したいと思います (したがって、適切な方法で高さと幅を増やします)。したがって、次の制約があります。

  1. オブジェクトを誤って切り取らないようにするために、領域の幅と高さを縮小しないでください。
  2. 境界チェック: 領域サイズの適応では、新しい座標が画像内にあることを確認する必要があります。
  3. サブイメージの幅と高さの比率は、指定されたアスペクト比とほぼ等しくなければなりません。

この問題を解決するには?

更新: 考えられる解決策の 1 つ

私の問題の解決策は、主にマークがこの回答で提案したアルゴリズムです。このアルゴリズムの結果、元の領域よりも幅が広いか高い新しい領域が作成され、元の領域の中心を移動することなく、指定された値に非常に近い新しい縦横比を取得できます (可能であれば、領域の位置によって異なります)。元の画像内の領域)。このアルゴリズムから得られた領域は、アスペクト比を指定されたものに近づけるために、次のアルゴリズムによってさらに処理できます。

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 に等しくなります。

2 番目のアルゴリズム (後処理)。

  • 入力: 領域 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 に答える