尝试将尺寸为100x100的灰度图像切片为尺寸为39x39且重叠的补丁,尺寸为1.这意味着将开始下一个补丁向右/向下的一个像素仅与一个附加的列/行中的先前的修补程序不同。将图片切片成重叠的补丁并将补丁合并到图像的快速方法
代码的粗糙的轮廓:首先计算每个补丁的索引,所以能够 从图像构造贴剂的2D阵列,并能够从贴剂构建图像:
patches = imgFlat[ind]
'patches'是一个2D数组,每列包含一个矢量形式的补丁。
对这些补丁进行处理,每个补丁单独和之后再次与预先计算的索引合并为一个图像。
img = np.sum(patchesWithColFlat[ind],axis=2)
补丁程序重叠,它是在结束必要的预先计算的权重乘以IMG:
imgOut = weights*imgOut
我的代码是很慢和速度是一个关键问题,因为这应该是上完成约10^8个补丁。
函数get_indices_for_un_patchify和weights_unpatchify可以预先计算一次,所以速度只是修补和未修补的问题。
感谢您的任何提示。
卡洛斯
import numpy as np
import scipy
import collections
import random as rand
def get_indices_for_un_patchify(sImg,sP,step):
''' creates indices for fast patchifying and unpatchifying
INPUTS:
sx image size
sp patch size
step offset between two patches (default == [1,1])
OUTPUTS:
patchInd collection with indices
patchInd.img2patch patchifying indices
patch = img(patchInd.img2patch);
patchInd.patch2img unpatchifying indices
NOTE: * for unpatchifying necessary to add a 0 column to the patch matrix
* matrices are constructed row by row, as normally there are less rows than columns in the
patchMtx
'''
lImg = np.prod(sImg)
indImg = np.reshape(range(lImg), sImg)
# no. of patches which fit into the image
sB = (sImg - sP + step)/step
lb = np.prod(sB)
lp = np.prod(sP)
indImg2Patch = np.zeros([lp, lb])
indPatch = np.reshape(range(lp*lb), [lp, lb])
indPatch2Img = np.ones([sImg[0],sImg[1],lp])*(lp*lb+1)
# default value should be last column
iRow = 0;
for jCol in range(sP[1]):
for jRow in range(sP[0]):
tmp1 = np.array(range(0, sImg[0]-sP[0]+1, step[0]))
tmp2 = np.array(range(0, sImg[1]-sP[1]+1, step[1]))
sel1 = jRow + tmp1
sel2 = jCol + tmp2
tmpIndImg2Patch = indImg[sel1,:]
# do not know how to combine following 2 lines in python
tmpIndImg2Patch = tmpIndImg2Patch[:,sel2]
indImg2Patch[iRow, :] = tmpIndImg2Patch.flatten()
# next line not nice, but do not know how to implement it better
indPatch2Img[min(sel1):max(sel1)+1, min(sel2):max(sel2)+1, iRow] = np.reshape(indPatch[iRow, :, np.newaxis], sB)
iRow += 1
pInd = collections.namedtuple
pInd.patch2img = indPatch2Img
pInd.img2patch = indImg2Patch
return pInd
def weights_unpatchify(sImg,pInd):
weights = 1./unpatchify(patchify(np.ones(sImg), pInd), pInd)
return weights
# @profile
def patchify(img,pInd):
imgFlat = img.flat
# imgFlat = img.flatten()
ind = pInd.img2patch.tolist()
patches = imgFlat[ind]
return patches
# @profile
def unpatchify(patches,pInd):
# add a row of zeros to the patches matrix
h,w = patches.shape
patchesWithCol = np.zeros([h+1,w])
patchesWithCol[:-1,:] = patches
patchesWithColFlat = patchesWithCol.flat
# patchesWithColFlat = patchesWithCol.flatten()
ind = pInd.patch2img.tolist()
img = np.sum(patchesWithColFlat[ind],axis=2)
return img
我如调用这些函数,在这里与随机图像
if __name__ =='__main__':
img = np.random.randint(255,size=[100,100])
sImg = img.shape
sP = np.array([39,39]) # size of patch
step = np.array([1,1]) # sliding window step size
pInd = get_indices_for_un_patchify(sImg,sP,step)
patches = patchify(img,pInd)
imgOut = unpatchify(patches,pInd)
weights = weights_unpatchify(sImg,pInd)
imgOut = weights*imgOut
print 'Difference of img and imgOut = %.7f' %sum(img.flatten() - imgOut.flatten())
你有什么需要的补丁呢?也许整个事情可以作为一个卷积来完成。您的'patchify'功能可以通过虚幻的方式完成,可以随着步伐自由地玩耍,但我不确定它的反面。 – jorgeca
补丁用于训练神经网络.100x100图像被切成39x39的补丁。这些补丁被输入神经网络。然后将神经网络(也包括补丁)的输出合并在一起以再次获得100x100(或更小的)图像。这必须用不同的100x100图像多次完成。所以我真的很感兴趣,你觉得如何加快修补功能,“免费”呢? – user2425142
为什么你不使用scikit的'从2D功能提取补丁'?它只提供重叠的补丁。对于重建来说,“从补丁2d'重建功能。 – user3515225