我需要从图像中提取对象。我知道对象在图像中的位置,即对象所在的区域:该区域以一对坐标 [xmin,ymin] 和 [xmax,ymax]提供
我想修改该区域的坐标(从而以合适的方式增加高度和宽度),以便提取具有指定宽高比的子图像。因此,我们有以下约束:
如何解决这个问题?
更新:一种可能的解决方案
我的问题的解决方案主要是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]。
第一种算法(主要处理)。
第二种算法(后期处理)。
答案 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 。我们的想法是扩展宽度或高度: