Given be a rectangular image img
and patch s
. Now I would like to cover the whole image with square patches of side length s
, so that every pixel in img
is in at least one patch using the minimal number of patches. Furthermore I want neighboured patches to have as little overlap as possible.
Thus far: I have included my code below and worked out an example. However it does not work yet perfectly. Hopefully, someone finds the error.
Example: Given is img
of shape: (4616, 3016)
and s = 224
That means I will 21 patches on the longer side, 14 patches on the smaller the width, 21*14 = 294 patches in total.
Now I try to figure out patches how to distribute the overlap between the patches.
My patches can cover an image of size: (4704, 3136)
, thus my patches in the height have to cover 88 overlapping pixels missing_h = ht * s - h
, width is analogous.
Now I try to figure out, how to distribute 88 pixels on 21 patches. 88 = 4* 21 + 4
Thus I will have hso = 17
patches with overlap shso = 4
and hbo = 4
patches with overlap 5, width is analogous.
Now I simply loop over the whole image and keep track on my current position (cur_h, cur_w)
. After each loop I adjust, cur_h, cur_w
. I have s
, my current patch number i, j
, that indicates if the patch has a small or big overlap.
import numpy as np def part2(img, s): h = len(img) w = len(img[0]) ht = int(np.ceil(h / s)) wt = int(np.ceil(w / s)) missing_h = ht * s - h missing_w = wt * s - w hbo = missing_h % ht wbo = missing_w % wt hso = ht - hbo wso = wt - wbo shso = int(missing_h / ht) swso = int(missing_w / wt) patches = list() cur_h = 0 for i in range(ht): cur_w = 0 for j in range(wt): patches.append(img[cur_h:cur_h + s, cur_w: cur_w + s]) cur_w = cur_w + s if j < wbo: cur_w = cur_w - swso - 1 else: cur_w = cur_w - swso cur_h = cur_h + s if i < hbo: cur_h = cur_h - shso - 1 else: cur_h = cur_h - shso if cur_h != h or cur_w != w: print("expected (height, width)" + str((h, w)) + ", but got: " + str((cur_h, cur_w))) if wt*ht != len(patches): print("Expected number patches: " + str(wt*ht) + "but got: " + str(len(patches)) ) for patch in patches: if patch.shape[0] != patch.shape[1] or patch.shape[0] != s: print("expected shape " + str((s, s)) + ", but got: " + str(patch.shape)) return patches def test1(): img = np.arange(0, 34 * 7).reshape((34, 7)) p = part2(img, 3) print("Test1 successful") def test2(): img = np.arange(0, 4616 * 3016).reshape((4616, 3016)) p = part2(img, 224) print("Test2 successful") test1() test2()
Advertisement
Answer
Above problem can be fixed, making the following edits:
hbo = missing_h % (ht-1) wbo = missing_w % (wt-1) shso = int(missing_h / (ht-1)) swso = int(missing_w / (wt-1))