Создание маски для удаления тени с одного изображения - PullRequest
0 голосов
/ 06 мая 2020

Я пытаюсь реализовать эту бумагу в python. В документе делается попытка удалить два вида теней на изображении: расплывчатые тени (постепенно меняющиеся, без четких границ, таких как собственные тени) и отбрасываемые тени (тени с жесткими границами). После оценки бинарных теневых масок для нечетких и отбрасываемых теней я не понимаю, как они комбинируют маски в соответствии с (этапы 10 и 11).

Gradient magnitude

combining shadow masks , step 10 and 11

скажем, если размер моего входного изображения (428, 500,3), градиент x, y_gradient и ответ величины градиента также будут (428, 500 , 3), а две маски (HS и VS) будут иметь размер (428, 500). Согласно шагу 10, я думаю, что они складывают маски горизонтально, что дало бы мне комбинированную двоичную маску размерности (428, 1000). Меня смущает шаг 11: если G_x и G_y - это x_gradient и y_gradient, как можно поэлементно умножить комбинированный двоичный массив размера (428, 1000) на градиенты размера (428,500,3)?

Это мой код до сих пор, мне еще предстоит закодировать оценку жестких теней и восстановление изображения без теней с использованием уравнения Пуассона.

import cv2
import numpy as np
#log transform image
orig_im = cv2.imread("cube.jpg")
cv2.imshow('orig mage', orig_im)
c = 255 / np.log1p(np.max(orig_im)) 
log_im =  c*(np.log1p(orig_im))
log_im = np.array(log_im, dtype = np.uint8) 
cv2.imshow('log image', log_im)

#gradients 
gx_im = cv2.Sobel(log_im, cv2.CV_64F, 1, 0, ksize=1)
gy_im = cv2.Sobel(log_im, cv2.CV_64F, 0, 1, ksize=1)
gm_im = np.hypot(gx_im, gy_im)
cv2.imshow('grad mag image', gm_im.astype(np.uint8))

#Threshold calc
alpha = 0.5
T = alpha*np.max(gm_im)
gm_max = np.max(gm_im, axis = 2)
mask_size = orig_im.shape[0:2]
vs = np.zeros(mask_size)
vs[gm_max < T] = 1 
gm_vs = gm_im
for i in range(3):
    gm_vs[:,:,i] = np.multiply(gm_vs[:,:,i],vs)
cv2.imshow('grad vs masked image', gm_vs.astype(np.uint8))

#reconstruction
divx = cv2.Sobel(gm_vs, cv2.CV_64F, 1, 0, ksize=1)
divy = cv2.Sobel(gm_vs, cv2.CV_64F, 0, 1, ksize=1)
div = divx + divy
cv2.imshow('div image', np.abs(div).astype(np.uint8))

Входное изображение

Input image

Градиентное изображение

Gradient magnitude image

Изображение расхождения согласно шагу 12

Divergence image according to step 12

...