将一组对象拆分成一定数量的组的算法?

时间:2011-04-29 05:58:28

标签: algorithm split grouping

例如,假设我有一个2D像素数组(换句话说,一个图像),我想将它们排列成组,这样组的数量就会完全合计到一定数量(例如,总项目数)在另一个2D像素阵列中)。目前,我尝试的是使用比率和像素的组合,但除了完美的整数比率(因此1:2,1:3,1:4等)之外的任何事情都会失败。当它失败时,它只是将它缩放到小于它的整数,因此,例如,1:2.93比例的比例将使用1:2比例,其中部分图像被截断。我宁愿不这样做,所以我可以使用哪些算法不进入Matrix Multipication?我记得看过类似于我刚才提到的内容,但我找不到它。这是NP型问题吗?

例如,假设我有一个12×12像素的图像,我想将其分成64个n-by-m尺寸的子图像。通过分析,我可以看到我可以将其分解为8个2×2子图像和56个2×1子图像,以便获得精确数量的子图像。所以,换句话说,我会得到8 + 56 = 64个子图像使用全部4(8)+56(2)= 144像素。

同样地,如果我有一个13乘13像素的图像,并且我想要81个n×m大小的子图像,我需要将其分解为4个2×2子图像,76 2 1个子图像和1个1×1子图像,以获得所需的子图像的确切数量。换句话说,4(4)+76(2)+ 1 = 169和4 + 76 + 1 = 81。

又一个例子,如果我想将相同的13乘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.

当然,图像不需要是正方形,既不是子图像的数量,也不应该是素数。另外,子图像的数量应该小于图像中的像素数量。为了便于将一个较大的子图像转换成多个子图像,我可能希望坚持子图像的宽度和高度为2的幂,但是如果我能找到一个不这样做的算法,那么会更好。这基本上就是我想要找到的算法。

2 个答案:

答案 0 :(得分:1)

据我所知,您希望将给定大小的矩形图像分割为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,其中/是整数除法。此外,您可能希望采用周长最小的x * y矩形,即x + y的最小值。

对于问题中的三个例子:

  • 12 x 12图片拆分为64个子图像,得到R = {(1,2),(2,1)},因此您有64个1 x 2子图像或64个2 x 1子图像

  • 13 x 13图片拆分为81个子图像,您需要R = {(1,2),(2,1)},因此您有64个1 x 2子图像或64个2 x 1子图像

  • 13 x 13图片拆分为36个子图像,您需要R = {(1,4),(2,2),(4,1)},因此您可以使用36个2 x 2子图像(最小周长)

对于每个例子,你当然可以组合不同大小的矩形。

如果您想要做其他事情,可能平铺原始图片,您可能需要查看rectangle tiling algorithms

答案 1 :(得分:0)

如果您不关心尺寸不同的子图像,一种简单的方法是重复将子图像分成两部分。每次新分割都会将子图像的数量增加一个。