我正在尝试用 openCV 编写这段小代码,它会告诉我图像改变颜色的程度,并基于此和阈值它成为一个或另一个组的一部分。
我所拥有的是颜色略有不同的相同图像列表。
现在这些是测试图像,基于它们我应该以某种方式量化颜色的变化,并以此为基础让其他一些图片通过或不通过。
我想过要取平均值,但这只是棕黄色,不是一个好的衡量标准。
我想到了主色,但随着图片在整个过程中改变颜色......
但我不知道我还能尝试什么。
有没有办法设置一系列图片必须遵守的颜色范围来验证?
如果有人可以帮助我朝一个方向发展,那就太棒了!
根据要求提供 sample 第一张图片:
第二张图片:
第三张图片:
图片列表是这张图片的列表,但色调稍深或较浅,反光或多或少。
到目前为止,我编写的所有代码只是为了获取我可以分析的 ROI 列表。
编辑:
形状总是一样的,背景也是一样的。只有颜色和亮度似乎都在变化。
我现在已经在时间序列中绘制了 RG&B 值。这并没有说很多。
我现在正试图通过评估背景中的颜色差异(因为它不应该改变每个差异应该是由于亮度)来将亮度从等式中分离出来,并使用该系数来加权 R、G 和 B channel 。
我会及时通知你们。
最佳答案
我认为稍微不同的方法可能会更好:
因此,我将您的 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
希望你能看到:请注意,您可以在终端中使用 执行非常相似的操作。 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 相同的模式。
关于python - OpenCV,我如何量化像素在整个帧中的颜色变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64569443/