長方形の画像img
とパッチが与えられますs
。s
ここで、最小数のパッチを使用して、すべてのピクセルがimg
少なくとも 1 つのパッチに含まれるように、画像全体を辺の長さの正方形のパッチでカバーしたいと考えています。さらに、隣接するパッチの重なりをできるだけ少なくしたいと考えています。
これまでのところ: 以下にコードを含め、例を作成しました。ただし、まだ完全には機能しません。うまくいけば、誰かがエラーを見つけます。
例: 与えられimg
た形状:(4616, 3016)
そして、s = 224
つまり、長辺に 21 パッチ、幅の狭い側に 14 パッチ、合計で 21*14 = 294 パッチになります。
今、パッチ間のオーバーラップを分散する方法を見つけようとしています。私のパッチはサイズの画像をカバーできます: (4704, 3136)
、したがって、高さの私のパッチは 88 個の重複するピクセルをカバーする必要がありmissing_h = ht * s - h
、幅は類似しています。
今、私は 21 個のパッチに 88 ピクセルを分配する方法を理解しようとしています。88 = 4* 21 + 4 したがってhso = 17
、オーバーラップ のあるパッチshso = 4
とhbo = 4
オーバーラップ 5 のパッチがあり、幅は類似しています。
これで、画像全体をループして、現在の位置を追跡するだけ(cur_h, cur_w)
です。各ループの後、調整しcur_h, cur_w
ます。s
現在のパッチ番号はi, j
、パッチのオーバーラップが小さいか大きいかを示しています。
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()