画像からオブジェクトを抽出する必要があります。画像内のオブジェクトの位置、つまりオブジェクトが配置されている領域を知っています。この領域は、座標[xmin, ymin]と[xmax, ymax]のペアとして提供されます。
指定された縦横比でサブイメージを抽出するために、この領域の座標を変更したいと思います (したがって、適切な方法で高さと幅を増やします)。したがって、次の制約があります。
- オブジェクトを誤って切り取らないようにするために、領域の幅と高さを縮小しないでください。
- 境界チェック: 領域サイズの適応では、新しい座標が画像内にあることを確認する必要があります。
- サブイメージの幅と高さの比率は、指定されたアスペクト比とほぼ等しくなければなりません。
この問題を解決するには?
更新: 考えられる解決策の 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 です。