Как надежно адаптировать цвет/освещение наложения AR на основе темного текстурированного фона в OpenCV?Python

Программы на Python
Ответить
Anonymous
 Как надежно адаптировать цвет/освещение наложения AR на основе темного текстурированного фона в OpenCV?

Сообщение Anonymous »

Я работаю над проектом Университета дополненной реальности, используя Python и OpenCV. Моя цель — наложить 2D-графику (логотип с текстом) на плоский объект в видеопотоке. Мне нужно реализовать алгоритм цветокоррекции, чтобы наложение адаптировалось к изменениям освещения (тени, цветные огни) сцены, придавая ему реалистичный вид.
Подход: я реализовал стандартный метод Попиксельного усиления в пространстве HSV.
  • Я деформирую эталонное изображение к текущему кадру.
  • Я рассчитываю усиление для каналов H, S и V: Gain = Current_Frame / (Reference_Image + epsilon). Затем я обрезаю их, чтобы они не вышли из набора [0, 255]
  • Я применяю эти усиления к своему наложенному слою.
Проблема: Этот подход отлично работает, когда фон представляет собой сплошной цвет с высокой насыщенностью (например, синяя книга становится ярко-синей под светом). Наложение правильно адаптируется к новому оттенку.
Однако в моем пользовательском наборе данных он не работает:
  • Фон: темно-серый/черный прямоугольник с некоторой текстурой.
  • Наложение: ярко-желтый логотип.
  • Проблема. Поскольку фон темный (низкое значение) и серый (низкая насыщенность), в расчетных значениях усиления оттенка и насыщенности преобладает шум камеры. Когда я применяю эти шумовые усиления к своему ярко-желтому логотипу, он становится "запятнанным" оранжевыми/зелеными артефактами и выглядит грязным.
Что я пробовал:
  • Применение размытия по Гауссу к картам усиления (немного помогает, но лишь разводит пятна).
  • Обрезание усиления, чтобы избежать экстремальных значений.
  • Использование подхода «Частное изображение» (деление изображений в оттенках серого), который идеально решает проблему освещения/теней, но не может уловить изменения цветного освещения (например, если включается красный свет).
Вопрос: Существует ли стандартная «литература» подход или надежная стратегия для решения этого конкретного случая? Как адаптировать наложение к освещению сцены, не перенося высокочастотный шум темного фона на чистый яркий наложение? Мне нужно что-то не слишком сложное: учитель мог бы сказать, что я использовал ИИ!
Стандартный подход «выигрыш», который работает с унифицированным книжным кейсом: GAIN APPROACH [ЛЕГКИЙ СЛУЧАЙ], его маска здесь.

Стандартный подход «выигрыш», который НЕ работает с кейсом LEGO: GAIN APPROACH [FAIL CASE], его маска здесь.
Это это функция, которую я использую. Я также реализовал вторую версию, в которой я рассматриваю усиление H как угол, используя «diff_h» вместо «gain_h» для суммирования исходного H. Я также пытался управлять логикой H 0-180 ° в OpenCV... Но ничего не меняется!
# With this function, you apply a pixel to pixel HSV convertion
def hsv_correction_PBP(frame_, ref_img_, ar_layer_, ar_mask_, M_, KSize = (5,5), colorize = True):
h_f, w_f = frame_.shape[:2]

# --- STEP A: Warping to bring every image in the current frame reference system
# Use BORDER_REPLICATE to avoid that black border ruin the computation on the edges
ref_warped = cv2.warpPerspective(ref_img_, M_, (w_f, h_f), borderMode=cv2.BORDER_REPLICATE)
ar_layer_warped = cv2.warpPerspective(ar_layer_, M_, (w_f, h_f), borderMode=cv2.BORDER_REPLICATE)
ar_mask_warped = cv2.warpPerspective(ar_mask_, M_, (w_f, h_f))

# --- STEP B: Convert from BGR to HSV
hsv_frame = cv2.cvtColor(frame_, cv2.COLOR_BGR2HSV).astype(float)
hsv_ref = cv2.cvtColor(ref_warped, cv2.COLOR_BGR2HSV).astype(float)
hsv_layer = cv2.cvtColor(ar_layer_warped, cv2.COLOR_BGR2HSV).astype(float)

# --- STEP C: Calculate the gain matrixes for H, S & V
gain_h_map = hsv_frame[:,:,0] / (hsv_ref[:,:,0] + EPSILON)
gain_s_map = hsv_frame[:,:,1] / (hsv_ref[:,:,1] + EPSILON)
gain_v_map = hsv_frame[:,:,2] / (hsv_ref[:,:,2] + EPSILON)

if (colorize): # The 'colorize' flag will be useful later when testing algorithm without color correction
# --- STEP D: Gaussian Filter to smooth the V gain
gain_v_map = cv2.GaussianBlur(gain_v_map, KSize, 0)
gain_s_map = cv2.GaussianBlur(gain_s_map, KSize, 0)
gain_h_map = cv2.GaussianBlur(gain_h_map, KSize, 0)

# --- STEP E: Apply the H, S & V correction through gain matrixes on the layer H, S & V parameters
hsv_layer[:,:,2] = hsv_layer[:,:,2] * gain_v_map
hsv_layer[:,:,1] = hsv_layer[:,:,1] * gain_s_map
hsv_layer[:,:,0] = hsv_layer[:,:,0] * gain_h_map

# They must be between 0 and 255
hsv_layer[:,:,2] = np.clip(hsv_layer[:,:,2], 0, 255)
hsv_layer[:,:,1] = np.clip(hsv_layer[:,:,1], 0, 255)
hsv_layer[:,:,0] = np.clip(hsv_layer[:,:,0], 0, 255)

# --- STEP F: Return the layer in BGR format
return cv2.cvtColor(hsv_layer.astype(np.uint8), cv2.COLOR_HSV2BGR), ar_mask_warped



Подробнее здесь: https://stackoverflow.com/questions/798 ... d-backgrou
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»