【发布时间】:2017-10-30 09:24:31
【问题描述】:
我现在需要获取 10 张图片 (400px,400px) 的 RGB 值的均值和标准差。我的意思是mean_of_Red(x,y)、std_of_Red(x,y)等等……
使用 cv2.imread,我得到了 10 (400,400,3) 个形状数组。所以,我首先尝试使用 numpy.dstack 来堆叠每个 RGB 值以获得 (400,400,3,10) 形状数组。但是,它不起作用,因为数组的形状会随着迭代而改变。
所以,我终于在下面写了代码
def average_and_std_of_RGB(pic_database,start,num_past_frame):
background = pic_database[0] #initialize background
past_frame = pic_database[1:num_past_frame+1]
width,height,depth = background.shape
sumB = np.zeros(width*height)
sumG = np.zeros(width*height)
sumR = np.zeros(width*height)
sumB_sq = np.zeros(width*height)
sumG_sq = np.zeros(width*height)
sumR_sq = np.zeros(width*height)
for item in (past_frame):
re_item = np.reshape(item,3*width*height) #reshape (400,400,3) to (480000,)
itemB =[re_item[i] for i in range(3*width*height) if i%3==0] #Those divisible by 3 is Blue
itemG =[re_item[i] for i in range(3*width*height) if i%1==0] #Those divisible by 1 is Green
itemR =[re_item[i] for i in range(3*width*height) if i%2==0] #Those divisible by 2 is Red
itemB_sq = [item**2 for item in itemB]
itemG_sq = [item**2 for item in itemG]
itemR_sq = [item**2 for item in itemR]
sumB = [x+y for (x,y) in zip(sumB,itemB)]
sumG = [x+y for (x,y) in zip(sumG,itemG)]
sumR = [x+y for (x,y) in zip(sumR,itemR)]
sumB_sq = [x+y for (x,y) in zip(sumB_sq,itemB_sq)]
sumG_sq = [x+y for (x,y) in zip(sumG_sq,itemG_sq)]
sumR_sq = [x+y for (x,y) in zip(sumR_sq,itemR_sq)]
aveB = [x/num_past_frame for x in sumB]
aveG = [x/num_past_frame for x in sumG]
aveR = [x/num_past_frame for x in sumR]
aveB_sq = [x/num_past_frame for x in sumB]
aveG_sq = [x/num_past_frame for x in sumR]
aveR_sq = [x/num_past_frame for x in sumR]
stdB = [np.sqrt(abs(x-y**2)) for (x,y) in zip(aveB_sq,aveB)]
stdG = [np.sqrt(abs(x-y**2)) for (x,y) in zip(aveG_sq,aveG)]
stdR = [np.sqrt(abs(x-y**2)) for (x,y) in zip(aveR_sq,aveR)]
return sumB,sumG,sumR,stdB,stdG,stdR
它确实有效,但看起来很残酷并且需要一些时间。 我想知道是否有更有效的方法来获得相同的结果。 请帮我一把,谢谢。
【问题讨论】:
标签: python arrays numpy opencv