In competitive games with purple enemy outlines (like Valorant), bright map lighting (e.g. Bind or Sunset) shifts HSV values:
import cv2, numpy as np
def get_adaptive_mask(img_bgr):
hsv = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2HSV)
# Compute median V channel for ambient light compensation
median_v = np.median(hsv[:, :, 2])
lower_v = max(110, int(median_v * 0.7))
lower_purple = np.array([140, 100, lower_v])
upper_purple = np.array([160, 255, 255])
mask = cv2.inRange(hsv, lower_purple, upper_purple)
# Morphological opening to eliminate single-pixel noise
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
return cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)