我认为稍微不同的方法可能会更好:
所以,我将您的 3 个帧重命名为 f-1.png、f-2.png 和 f-3.png 并运行:
#!/usr/bin/env python3
import cv2
import numpy as np
import pathlib
def ProcessOne(filename):
"""Process a single image for the Hue, Saturation and Value of the foreground pixels"""
# Load image
im = cv2.imread(filename, cv2.IMREAD_COLOR)
# Segment to get interesting area
grey = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
_, th = cv2.threshold(grey,128,255,cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)
ff = th.copy()
h, w = th.shape[:2]
mask = np.zeros((h+2, w+2), np.uint8)
# Floodfill from (0, 0)
cv2.floodFill(ff, mask, (0,0), 255);
res = ~(th | ~ff)
# This is all debug and can be removed
cv2.imwrite('DEBUG-grey.png',grey)
cv2.imwrite('DEBUG-th.png',th)
cv2.imwrite('DEBUG-mask.png',mask)
cv2.imwrite('DEBUG-ff.png',ff)
cv2.imwrite('DEBUG-res.png',res)
# Convert original image to HSV and split channels
HSV = cv2.cvtColor(im, cv2.COLOR_BGR2HSV)
H, S, V = cv2.split(HSV)
maskedHue = np.ma.masked_where(res,H)
meanHue = maskedHue.mean()
maskedSat = np.ma.masked_where(res,S)
meanSat = maskedSat.mean()
maskedVal = np.ma.masked_where(res,V)
meanVal = maskedVal.mean()
print(f'Filename: {filename}, Hue: {meanHue}, Sat: {meanSat}, Val: {meanVal}')
# Process all frames f-XXX.png
for filename in pathlib.Path.cwd().glob('f-*.png'):
ProcessOne(filename.name)
我得到了这些结果:
Filename: f-1.png, Hue: 166.95651173492868, Sat: 125.59134836631385, Val: 116.88587206626784
Filename: f-2.png, Hue: 141.85912185959145, Sat: 62.537684902559285, Val: 64.28621742193003
Filename: f-3.png, Hue: 163.32165750915752, Sat: 110.39972527472527, Val: 90.87522893772893
希望你能看到:
- 第一个图像是饱和的 (Hue=125) 和明亮的值 (Val=116)
- 第二张图像较灰,或饱和度较低 (Sat=62),较暗 (Val=64)
- 第三张图像几乎和第一张一样饱和和明亮
请注意,您可以使用 ImageMagick 在终端中执行非常类似的操作。在这里,我从左上角的偏移量 (40,40) 开始裁剪出一个 30x30 像素的正方形(以青色标记)。
然后我通过将像素大小调整为 1x1 来平均像素并转换为 HSV 色彩空间并将结果打印为文本:
magick f-1.png -crop 30x30+40+40 -resize 1x1\! -colorspace HSV txt:
0,0: (343.898,50.9512%,45.2334%) #F48273 hsv(343.898,50.9512%,45.2334%)
和
magick f-2.png -crop 30x30+40+40 -resize 1x1\! -colorspace HSV txt:
0,0: (353.646,26.5537%,24.0175%) #FA443D hsv(353.646,26.5537%,24.0175%)
和
magick f-3.png -crop 30x30+40+40 -resize 1x1\! -colorspace HSV txt:
0,0: (346.963,45.7643%,35.3905%) #F6755A hsv(346.963,45.7643%,35.3905%)
它显然使用了稍微不同的图像区域和不同的值范围,但如果你查看最后一个字段,即hsv(...),你会发现它遵循与 Python 相同的模式。