这段代码的前提条件很长,所以我会尽力概括。WB/RG/BYColor是基础图像,FIDO是该基础图像的覆盖层,应用于它。S_wb/rg/by是最终的输出图像。WB/RG/BYColor与FIDO的大小相同。
对于FIDO中的每个独特元素,我们想计算该区域在基础图片中的平均颜色。下面的代码可以实现此目的,但是由于numFIDOs非常大(高达40,000),因此这需要很长时间。
这些平均值是针对三个独立的RGB通道计算的。
sX=200
sY=200
S_wb = np.zeros((sX, sY))
S_rg = np.zeros((sX, sY))
S_by = np.zeros((sX, sY))
uniqueFIDOs, unique_counts = np.unique(FIDO, return_counts=True)
numFIDOs = uniqueFIDOs.shape
for i in np.arange(0,numFIDOs[0]):
Lookup = FIDO==uniqueFIDOs[i]
# Get average of color signals for this FIDO
S_wb[Lookup] = np.sum(WBColor[Lookup])/unique_counts[i]
S_rg[Lookup] = np.sum(RGColor[Lookup])/unique_counts[i]
S_by[Lookup] = np.sum(BYColor[Lookup])/unique_counts[i]
这需要大约7.89秒才能运行,不算太长,但会包含在另一个循环中,所以会逐渐累积!
我已经尝试了向量化(如下所示),但我无法做到。
FIDOsize = unique_counts[0:numFIDOs[0]:1]
Lookup = FIDO ==uniqueFIDOs[0:numFIDOs[0]:1]
S_wb[Lookup] = np.sum(WBColor[Lookup])/FIDOsize
S_rg[Lookup] = np.sum(RGColor[Lookup])/FIDOsize
S_by[Lookup] = np.sum(BYColor[Lookup])/FIDOsize
数组大小匹配错误
indexarr = FIDO==uniqueFIDOs[i]
。然后只需执行S[indexarr] = np.sum(Color[indexarr])/FIDOsize
。你也可以通过使用uniqueFIDOs, unique_counts = np.unique(FIDO, return_counts=True)
来简化FIDOsize计算,然后只需FIDOsize = unique_counts[i]
。 - wflynny