我需要从图像中提取对象。我知道对象在图像内的位置,即对象所在的区域:该区域以一对坐标[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]。
第一种算法(主要处理)。
- 输入:初始区域和图像大小。
- 输出:它产生新的区域 r1 = [568 174 960 957],宽度 = 392 和高度 = 783,所以纵横比等于 0.5006。
第二种算法(后处理)。
- 输入:区域 r1。
- 输出:新区域 r2 = [568 174 960 958],宽度 = 392,高度 = 784,因此纵横比等于 0.5。