问题描述
我一直在研究一种使用 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
其中 z
是 n,m
。然后,我根据这个新计算的数量与起始尺寸之间的差异得到 pads
。
这样做我得到以下结果,例如:
经过同样的计算,我继续重建原始图像。补丁按大小为 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 = 300
和 step = 100
:
现在,从上面的例子来看,我应该用 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 = 200
和 step = 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
和通用 step <= win_size
的通用公式。
有人可以帮我吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)