我现在需要获得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
它确实有效,但看起来很残酷,需要一些时间。 我想知道是否有更有效的方法来获得相同的结果。 请帮我一把,谢谢。
答案 0 :(得分:1)
>>> img = cv2.imread("/home/auss/Pictures/test.png")
>>> means, stddevs = cv2.meanStdDev(img)
>>> means
array([[ 95.84747396],
[ 91.55859375],
[ 96.96260851]])
>>> stddevs
array([[ 48.26534676],
[ 48.24555701],
[ 55.92261374]])