创建用于从单个图像去除阴影的遮罩

时间:2020-05-06 07:56:30

标签: python image image-processing computer-vision shadow-removal

我正在尝试在python中实现this论文。本文尝试去除图像中的两种阴影:模糊阴影(逐渐变化且没有清晰的边界,如自阴影)和投射阴影(具有硬边界的阴影)。在估计了模糊和投射阴影的二进制阴影蒙版之后,我不明白它们是如何根据(步骤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

0 个答案:

没有答案