我为你的图片中构成沙漏的有趣像素制作了一个(相当粗糙的)蒙版,如下所示-mask.png
:
然后,我将您的图像转换为HSV色空间,并分离出Saturation通道.通常,在图像饱和且生动的情况下,该值较高;在图像较不生动、较不饱和且较灰色的情况下,该值较低.然后,我计算了遮罩区域中图像的平均值和标准差,然后在遮罩区域之外的区域中再次计算.
我假设沙漏的平均值会很低,因为沙漏是不饱和的,而沙漏的方差也会很低,因为沙漏内部的变化很小.设置结果阈值以匹配您的数据.
#!/usr/bin/env python3
import cv2 as cv
# Load mask with interesting pixels masked as white
mask = cv.imread('mask.png', cv.IMREAD_GRAYSCALE)
def processOne(filename, mask):
# Load image, convert to HSV, and split out S component
im = cv.imread(filename)
HSV = cv.cvtColor(im, cv.COLOR_BGR2HSV)
_, S, _ = cv.split(HSV)
# Calculate masked mean and stddev of S component
mean, stddev = cv.meanStdDev(S,mask=mask)
print(f'File: {filename}, MASKED AREA {mean=}, {stddev=}')
mean, stddev = cv.meanStdDev(S,mask=~mask)
print(f'File: {filename}, UNMASKED AREA {mean=}, {stddev=}')
processOne('h1.png', mask)
processOne('h2.png', mask)
processOne('h3.png', mask)
Output:
File: h1.png, MASKED AREA mean=array([[13.89722222]]), stddev=array([[10.40768909]])
File: h1.png, UNMASKED AREA mean=array([[74.00181488]]), stddev=array([[33.2070991]])
File: h2.png, MASKED AREA mean=array([[55.66944444]]), stddev=array([[22.63463815]])
File: h2.png, UNMASKED AREA mean=array([[144.43647913]]), stddev=array([[18.2676475]])
File: h3.png, MASKED AREA mean=array([[15.55833333]]), stddev=array([[12.96799211]])
File: h3.png, UNMASKED AREA mean=array([[96.01270417]]), stddev=array([[32.66029606]])