繁体   English   中英

平均后图像为灰色

[英]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

我无法真正解释您的代码出了什么问题,因为我不确定问题中的缩进是否反映了您的实际代码,但需要指出以下几点:

  • redArry,blueArry和greenArry在不需要时被声明为全局。 在每次调用average(group)的开始时将它们初始化为空,以避免发生错误。
  • 从问题的缩进来看,好像您在实际遍历整个图像数组之前返回了合并的图像。
  • 请注意如何在每个像素处将sumRed,sumBlue和sumGreen初始化为0(在x ...和y ...的两个循环中)。 由于您要在转到下一个图像之前先遍历图像的各个像素,因此您实际上从未对每个图像的像素求和。

我建议您利用函数作用域来了解变量应在何处初始化,可以在何处更新以及在何处不应该使用它。 这样可以节省大量调试时间!

编辑: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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM