使用OpenCV检测噪声帧

问题描述 投票:0回答:1

我有一个FPV(第一人称视角)接收器,显示了从安装在无人机上的FPV摄像机接收的帧。发射器工作时,接收器显示摄像机视图。否则,如果连接断开或变送器不工作,则会显示噪声帧。

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

附有噪声帧的样本。

enter image description here

[另一个噪声帧示例:enter image description here

一个有效的帧(可以是任何东西)enter image description here

python opencv image-processing noise
1个回答
0
投票

假设您的有效视频帧至少具有一定数量的颜色信息,并且您的噪声帧或多或少是黑白的,则可以使用HSV color space中的饱和通道进行简单处理。

  • 使用将图像转换为HSV色彩空间,请参见cv2.cvtColor
  • 计算饱和通道的直方图,请参见cv2.cvtColor
  • 计算具有最小饱和度的像素百分比,至少等于cv2.calcHist
  • [如果该百分比超过阈值,比方说cv2.calcHist,那么所有像素中至少有百分之五十的饱和度至少为0.05,因此该帧似乎是有效帧。 (如果需要,请调整阈值。)
0.5

可视化输出(按问题出现的顺序:]

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('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))

Noise 1

并且,主要输出:

Noise 2

[删除整个可视化内容,Valid调用在我的机器上每个图像需要少于0.01秒。不确定在录制时使用哪种硬件,但是也许这种方法也适用于某些具有足够帧频的“实时”处理。]

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

希望有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.