例如,假设我有一个 2D 像素数组(换句话说,一个图像),我想将它们排列成组,以便组数加起来完美达到某个数字(例如,另一个 2D 中的总项目数)像素阵列)。目前,我尝试使用比率和像素的组合,但这在完美整数比率(例如 1:2、1:3、1:4 等)以外的任何情况下都会失败。当它失败时,它只是将其缩放到小于它的整数,因此,例如,1:2.93 比例比例将使用 1:2 比例,并截掉部分图像。我不想这样做,那么我可以使用哪些不进入矩阵乘法的算法?我记得看到过与我最初提到的类似的东西,但我找不到它。这是一个NP型问题吗?
例如,假设我有一个 12×12 像素的图像,我想将其分割为 64 个 n×m 大小的子图像。通过分析可以看出,我可以将其分解为 8 个 2×2 子图像和 56 个 2×1 子图像,以获得确切数量的子图像。所以,换句话说,我将使用所有 4(8)+56(2)=144 像素获得 8+56=64 个子图像。
同样,如果我有一个 13 x 13 像素的图像,并且想要 81 个 n×m 大小的子图像,我需要将其分成 4 个 2×2 子图像,即 76 个 2×2 子图像。 1 个子图像和 1 个 1×1 子图像以获得所需子图像的确切数量。换句话说,4(4)+76(2)+1=169并且4+76+1=81。
另一个例子,如果我想将相同的 13 x 13 图像分割成 36 个 n×m 大小的子图像,我将需要 14 个 4×2 子图像、7 个 2×2 子图像、14 个 2×1 子图像和 1 个 1×1 子图像。换句话说,8(13)+4(10)+2(12)+1=169,13+10+12+1=36。
当然,图像不必是正方形,子图像的数量也不必是正方形,但都不应该是素数。此外,子图像的数量应小于图像中的像素数。我可能想坚持子图像的宽度和高度的二次方,以便于将一个较大的子图像转换为多个子图像,但如果我能找到一种不这样做的算法,那么它会会更好。这基本上就是我试图寻找算法的目的。
我知道你想将给定大小的矩形图像分割成n
矩形子图像。假设您有:
- 尺寸的图像
w * h
- 你想分成
n
大小的子图像x * y
我认为你想要的是
R = { (x, y) | x in [1..w], y in [1..h], x * y == (w * h) / n }
这就是对的集合(x, y)
这样x * y
等于(w * h) / n
, where /
是整数除法。另外,您可能想采取x * y
具有最小周长的矩形,即 的最小值x + y
.
对于问题中的三个例子:
分裂一个12 x 12
将图像分成64个子图像,你得到R = {(1,2),(2,1)}
,所以你有 641 x 2
子图像,或 642 x 1
子图像
分裂一个13 x 13
将图像分成81个子图像,你得到R = {(1,2),(2,1)}
,所以你有 641 x 2
子图像,或 642 x 1
子图像
分裂一个13 x 13
将图像分解为36个子图像,得到R = {(1,4),(2,2),(4,1)}
,所以你可以使用 362 x 2
子图像(最小周长)
对于每个示例,您当然可以组合不同大小的矩形。
如果你想做点别的事,也许tiling你的原始图像,你可能想看看矩形平铺算法 http://www.codeproject.com/Tips/149445/Rectangle-Tiling-Algorithm.aspx
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)