gpt4 book ai didi

python - 检测噪声帧

转载 作者:行者123 更新时间:2023-12-02 16:48:14 25 4
gpt4 key购买 nike

我有一个 FPV(第一人称视角)接收器,显示从安装在无人机上的 FPV 相机接收的帧。当发射器工作时,接收器显示摄像机 View 。否则,如果连接丢失或发射器不工作,它会显示噪声帧。

噪声帧具有随机模式(有时具有更多的白色像素,有时具有更多的黑色像素)。我想以一种有效的方式在 Python 中使用 OpenCV 检测那些噪声帧。我知道 OpenCV 有一个方法叫做 cv2.fastNlMeansDenoisingColored() .但在这种情况下,我想检测噪声帧而不是每帧中的噪声。

附上噪声帧示例:

enter image description here

另一个噪声帧示例:

enter image description here

一个有效的框架(可以是任何东西):

enter image description here

最佳答案

假设您的有效视频帧至少具有一定数量的颜色信息,并且您的噪声帧或多或少是黑白的,那么可能有一种使用来自 HSV color space 的饱和度 channel 的简单方法。 .

  • 使用将图像转换为 HSV 颜色空间,请参阅 cv2.cvtColor .
  • 计算饱和 channel 的直方图,见 cv2.calcHist .
  • 计算具有最小饱和度的像素百分比,比方说至少 0.05 .
  • 如果该百分比超过阈值,假设 0.5 ,那么所有像素中至少有 50% 的饱和度至少为 0.05 ,所以这个框架似乎是一个有效的框架。 (如果需要,调整阈值。)

  • import cv2
    from matplotlib import pyplot as plt
    import numpy as np
    from skimage import io # Only needed for web grabbing images, use cv2.imread for local images


    def is_valid(image):

    # Convert image to HSV color space
    image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

    # Calculate histogram of saturation channel
    s = cv2.calcHist([image], [1], None, [256], [0, 256])

    # Calculate percentage of pixels with saturation >= p
    p = 0.05
    s_perc = np.sum(s[int(p * 255):-1]) / np.prod(image.shape[0:2])

    ##### Just for visualization and debug; remove in final
    plt.plot(s)
    plt.plot([p * 255, p * 255], [0, np.max(s)], 'r')
    plt.text(p * 255 + 5, 0.9 * np.max(s), str(s_perc))
    plt.show()
    ##### Just for visualization and debug; remove in final

    # Percentage threshold; above: valid image, below: noise
    s_thr = 0.5
    return s_perc > s_thr


    # Read example images; convert to grayscale
    noise1 = cv2.cvtColor(io.imread('/image/Xz9l0.png'), cv2.COLOR_RGB2BGR)
    noise2 = cv2.cvtColor(io.imread('/image/9ZPAj.jpg'), cv2.COLOR_RGB2BGR)
    valid = cv2.cvtColor(io.imread('/image/0FNPQ.jpg'), cv2.COLOR_RGB2BGR)

    for img in [noise1, noise2, valid]:
    print(is_valid(img))

    可视化输出(按照问题中的顺序):

    Noise 1

    Noise 2

    Valid

    而且,主要输出:

    False
    False
    True

    删除整个可视化内容, is_valid在我的机器上,每张图像的通话需要不到 0.01 秒。不确定您在录制时使用哪种硬件,但也许这种方法也适用于一些具有足够帧速率的“实时”处理。

    最后一句话:我试图摆脱 OpenCV 直方图,并直接使用 NumPy 计算百分比,但这比提供的方法花费更多时间。奇怪的。

    希望有帮助!

    关于python - 检测噪声帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58924276/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com