[英]Image is all grey after averaging
import cv2
redArry = []
greenArry = []
blueArry = []
def chunk(n, lst):
n = min(n, len(lst) - 1)
return [lst[i:i + n] for i in range(len(lst) - n + 1)]
def average(group):
chunkCtrl = 0
for im in group:
B = im[:, :, 0]
G = im[:, :, 1]
R = im[:, :, 2]
redArry.append(R)
greenArry.append(G)
blueArry.append(B)
chunkCtrl +=1
if chunkCtrl == 2 :
for x in range(im.shape[0]):
for y in range(im.shape[1]):
chunkCtrl = 0
sumRed = 0
sumGreen = 0
sumBlue = 0
for i in range(2):
redImage = redArry[i]
sumRed += redImage[x, y]
print redImage
greenImage = greenArry[i]
sumGreen += greenImage[x, y]
print greenImage
blueImage = blueArry[i]
sumBlue += blueImage[x, y]
print blueImage
sumRed = sumRed / 2.0
sumGreen = sumGreen / 2.0
sumBlue = sumBlue / 2.0
image = cv2.merge((sumRed , sumGreen , sumBlue))
return image
arrayOfFrames = []
cap = cv2.VideoCapture('myVideo.mp4')
while (cap.isOpened()):
ret, frame = cap.read()
if ret == True:
arrayOfFrames.append(frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
elif cv2.waitKey(1) & 0xFF == ord('p'):
cv2.waitKey(0)
else:
break
cap.release()
cv2.destroyAllWindows()
groupedFrames = chunk(2 , arrayOfFrames)
for group in groupedFrames:
averagedImage = average(group)
cv2.imshow("Result" , averagedImage)
cv2.waitKey(0)
我正在尝试使用开放式简历和Python来平均视频。 我的想法是我将第1帧和第2帧取平均值,然后返回新图像。
算法将影片分割成帧数组。 将该数组分成重叠的块。 对于大块中的每个图像,将图像分为3个通道,获取每个通道的总和,使新图像的平均总和显示该图像
这是重写的平均值(组)函数:
def average(group):
chunkCtrl = 0
new_image = np.zeros(np.shape(group[0]))
for im in group:
chunkCtrl += 1
B = im[:, :, 0]
G = im[:, :, 1]
R = im[:, :, 2]
for x in range(im.shape[0]):
for y in range(im.shape[1]):
new_image[x,y,0] += B[x,y]
new_image[x,y,1] += G[x,y]
new_image[x,y,2] += R[x,y]
if chunkCtrl == 2:
new_image[x,y,0] = new_image[x,y,0]/2.0
new_image[x,y,1] = new_image[x,y,1]/2.0
new_image[x,y,2] = new_image[x,y,2]/2.0
# this is not necessary if your chunks are always 2 images, which they seem to be
if chunkCtrl == 2:
return new_image
return new_image
我无法真正解释您的代码出了什么问题,因为我不确定问题中的缩进是否反映了您的实际代码,但需要指出以下几点:
我建议您利用函数作用域来了解变量应在何处初始化,可以在何处更新以及在何处不应该使用它。 这样可以节省大量调试时间!
编辑:OpenCV很棒,并且有许多有用的图像处理工具。 一个很好的是: 图像融合
通过手动迭代Python中的所有元素来执行numpy数组的逐元素加法或除法是一种可怕的悲观化 。
利用numpy提供的矢量化算术运算 ,我们可以通过以下方式通过@ ma22从答案中重写函数:
def average_fast(group):
if len(group) == 1:
return np.float64(group[0])
new_image = np.zeros(np.shape(group[0]))
for im in group[:2]:
new_image += im
return new_image / 2.0
结果相同,代码减少了约60%(维护更少,恕我直言,更容易理解其功能)。 不仅如此-测量一组1024x1024 RGB图像上的两种方法,我们可以看到这种方法快了将近200倍(25毫秒,而近5秒钟)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.