【问题标题】:How to count black pixels of video frame?如何计算视频帧的黑色像素?
【发布时间】:2022-06-12 18:42:57
【问题描述】:

我需要计算视频中的黑色像素。我找到了读取 RGB 通道并计算帧的平均 RGB 值的 python 代码。相反,我需要它来计算黑色和彩色像素并计算彩色像素的平均值。 这是我一直在研究的程序

import cv2
import numpy as np

cap = cv2.VideoCapture(0)
while cap.isOpened():
    ret, frame = cap.read()
    cv2.imshow('frame', frame)
    b = frame[:, :, :1]
    g = frame[:, :, 1:2]
    r = frame[:, :, 2:]
    # computing the mean
    b_mean = round(np.mean(b))
    g_mean = round(np.mean(g))
    r_mean = round(np.mean(r))


    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
cap.release()
cv2.destroyAllWindows()```

【问题讨论】:

  • 黑色是主观的。您可以对每个通道应用一个阈值,并将所有 R、G 和 B 通道中具有非常低值的像素视为黑色。您不需要对每个通道设置阈值,然后对它们应用 OR 运算符,如果结果仍然为 0,则表示所有通道都为低电平。看看如何应用阈值。那么剩下的像素不是黑色的就可以应用平均docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html
  • 您是否有一条规则可以告诉您像素是否为“黑色”?你知道一种选择满足条件的 Numpy 数组元素的方法吗?您知道一种计算该选择中元素的方法吗?如果你把这些东西放在一起,你能解决问题吗?
  • 注意:视频不使用 RGB,因此如果您检查原始 YCC 数据,可能会更容易、更快,并且伪影更少(由于解压缩)。第二:“视频”是通用的。有些视频使用 16 作为黑色,有些使用 0。

标签: python rgb video-processing


【解决方案1】:

首先,你应该问自己“我认为黑色是什么?”。您要计算“完全”黑色的像素(RGB (0, 0, 0),灰度 0)还是仅显示黑色的像素?如果是后者,则需要引入一个黑色阈值。

注意:您发布的代码缺少 cv2 导入 :)

完成任务的一种解决方案:

[...]
# this threshold controls what counts as black (in grayscale)
black_threshold = 0

# convert the image to grayscale
frame_gray = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)

# count black pixels
black_pixel_count = len(np.argwhere(frame_gray <= black_threshold))

# count non-black pixels
non_black_pixel_count = (frame_gray.shape[0] * frame_gray.shape[1]) - black_pixel_count

# average for all channels, excluding black pixels
red_avg = int(np.mean(frame[frame_gray > black_threshold][:, 0]))
green_avg = int(np.mean(frame[frame_gray > black_threshold][:, 1]))
blue_avg = int(np.mean(frame[frame_gray > black_threshold][:, 2]))

【讨论】:

  • 然后考虑接受上面的答案以帮助其他有类似问题的人。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-13
  • 1970-01-01
  • 2013-10-10
  • 2012-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多