cv2.cvtColor
将图像转换为HSV颜色空间。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('https://istack.dev59.com/Xz9l0.webp'), cv2.COLOR_RGB2BGR)
noise2 = cv2.cvtColor(io.imread('https://istack.dev59.com/9ZPAj.webp'), cv2.COLOR_RGB2BGR)
valid = cv2.cvtColor(io.imread('https://istack.dev59.com/0FNPQ.webp'), cv2.COLOR_RGB2BGR)
for img in [noise1, noise2, valid]:
print(is_valid(img))
可视化输出(按照问题中的顺序):
而且,主要输出为:
False
False
True
去掉整个可视化部分后,在我的机器上,每张图像的is_valid
调用不到0.01秒。不确定你在录制时使用了哪种硬件,但也许这种方法也适用于某些具有足够帧速率的“实时”处理。
最后一点说明:我试图摆脱OpenCV直方图,并直接使用NumPy计算百分比,但这比所提供的方法花费更多时间。奇怪。
希望有所帮助!