一系列补丁重建的重叠列的划分公式

问题描述

我一直在研究一种使用 python 创建补丁的算法和用于训练神经网络的 tensorflow。我成功地创建了关于创建重叠补丁的部分,但我一直在努力重建补丁。我会解释我的想法。

假设我们有一个大小为 n x m 的图像,一个大小为 win_size 的窗口和一个步幅 step。为了重建补丁,我使用以下公式填充初始图像并获得完美贴合的补丁:

n = img.shape[0]
m = img.shape[1]
diff = np.array([n - window_size,m - window_size])
times = np.ceil(diff/step)
dims = np.multiply([step,step],times)
pads = window_size+dims-np.array([n,m])

这个想法是:我计算最小的整数 j 使得 step * j >= z - win_size 其中 zn,m。然后,我根据这个新计算的数量与起始尺寸之间的差异得到 pads

这样做我得到以下结果,例如:

enter image description here

经过同样的计算,我继续重建原始图像。补丁按大小为 np.ndarray(number of patches,win_size,channels) 分组,其中补丁以这种方式按行列顺序排列

p11 p12 p13 ... p1m
p21 p22 p23 ... p2m
... ... ... ... ...
pn1 pn2 ... ... pnm

img_p = [p11 p12 p13 ... p1m p21 p22 ... pnm]

我想做的是对各个补丁进行实际求和,然后平均重叠像素值 - 即将重叠补丁的像素除以重叠数。第一件事是用下面的代码完成:


or_shape = (n,m,3) + (pads[:2],0) # Just to let you understand this is the size of the padded image
result = np.zeros(or_shape,np.float32)

margin = win_size - step

i = 0
for w in range(wi):
    for h in range(hi):
        result[w*win_size-w*margin:(w+1)*win_size-w*margin,h*win_size-h*margin:(h+1)*win_size-h*margin] += img_p[i]
        i+=1

结果如下,假设 win_size = 300step = 100

overlapped

现在,从上面的例子来看,我应该用 2 将左右“损坏的列”和中间的列除以 3。然而,这个数字只适用于这个例子。

一般来说,我想要得到的是原始图像,应该是将每个重叠像素除以结果图像中重叠块的数量。所以在考虑的图像中:

---------------------
|   | 2 | 3 | 2 |   |
---------------------
| 2 | 3 | 4 | 3 | 2 |
---------------------
|  ... ... ... ...  |

#where 2,3,4 are the number of pixel overlapping which have been summed,i.e. the number which should 
#should be used to restore the original image via this formula 

result[i0:i0+offset,j0:j0+offset] /= 2 
result[i1:i1+offset1,j1:j1+offset1] /= 3 ... 

我已经能够为我添加的图像实现这种类型的机制,以防 win_size = 200step = 150。在这种特定情况下,我使用了以下代码:

for w in range(wi):
      for h in range(hi-1):
        result[w*win_size+w*margin:(w+1)*win_size+(w+1)*margin,step*(h+1):step*(h+1)+margin] /= 2


for h in range(hi):
     for w in range(wi-1):
        result[step*(w+1):step*(w+1)+margin,h*win_size+h*margin:(h+1)*win_size+(h+1)*margin] /= 2

win_size=200 step=150

它完美无缺。然而,它在一般情况下不起作用:这意味着它仅在特定情况下起作用。 我似乎找不到适用于通用 win_size 和通用 step <= win_size 的通用公式。

有人可以帮我吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)