首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检测噪声帧

检测噪声帧
EN

Stack Overflow用户
提问于 2019-11-18 23:10:36
回答 1查看 5.3K关注 0票数 5

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

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

附件中附有噪声帧的样本:

另一个噪声帧示例:

有效的框架(可以是任何内容):

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-19 05:55:23

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

  • 将图像转换为HSV颜色空间使用,请参阅cv2.cvtColor
  • 计算饱和通道的直方图,见cv2.calcHist
  • 计算具有最小饱和度的像素百分比,比如至少0.05
  • 如果这个百分比超过一个阈值,比如说0.5,那么所有像素中至少有50%的饱和度至少为0.05,因此这个帧似乎是一个有效的帧。(必要时调整阈值。)
代码语言:javascript
复制
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('https://i.stack.imgur.com/Xz9l0.png'), cv2.COLOR_RGB2BGR)
noise2 = cv2.cvtColor(io.imread('https://i.stack.imgur.com/9ZPAj.jpg'), cv2.COLOR_RGB2BGR)
valid = cv2.cvtColor(io.imread('https://i.stack.imgur.com/0FNPQ.jpg'), cv2.COLOR_RGB2BGR)

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

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

主要产出:

代码语言:javascript
复制
False
False
True

除去所有的可视化内容,is_valid调用在我的机器上每个映像所需的时间不到0.01秒。不确定,您在做录音时有哪些硬件,但也许这种方法也适用于一些具有足够帧速率的“实时”处理。

最后一点:我试图去掉OpenCV直方图,直接使用NumPy计算百分比,但这比现在的方法花费了更多的时间。真奇怪。

希望这能帮上忙!

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58924276

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档