File size: 2,105 Bytes
c509e76
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import cv2 
import numpy as np
import glob 
import os 
from tqdm import tqdm 
import random

im_paths = glob.glob('./img/*/*')

random.shuffle(im_paths)

for im_path in tqdm(im_paths):
    # im_path = './img/1/23-180_5-y4_Page_034-wVO0001-L1_3-T_6600-I_5535.png'
    if '-L1_' in im_path:
        alb_path = im_path.split('-L1_')[0].replace('img/','alb/') + '.png'
    else:
        alb_path = im_path.split('-L2_')[0].replace('img/','alb/') + '.png'

    if not os.path.exists(alb_path):
        print(im_path)
        print(alb_path)

    im = cv2.imread(im_path)
    alb = cv2.imread(alb_path)
    _, mask = cv2.threshold(cv2.cvtColor(alb,cv2.COLOR_BGR2GRAY), 1, 255, cv2.THRESH_BINARY)


    ## clean
    # std = np.max(np.std(alb,axis=-1))
    # print(std)
    im_min = np.min(im,axis=-1)
    kernel = np.ones((3,3))
    mask_erode = cv2.dilate(mask,kernel=kernel)
    mask_erode = cv2.erode(mask_erode,kernel=kernel)
    mask_erode = cv2.erode(mask_erode,iterations=4,kernel=kernel)
    metric = np.min(im_min[mask_erode==255])
    metric_num = 0
    if metric==0 or metric==1:
        metric_num = np.sum(im_min[mask_erode==255]==metric)
        if metric_num>=20:
            alb_temp = alb.astype(np.float64)
            alb_temp[alb_temp==0] = alb_temp[alb_temp==0]+1e-5
            shadow = np.clip(im.astype(np.float64)/alb_temp,0,1)
            shadow = (shadow*255).astype(np.uint8)

            shadow_path = im_path.replace('img/','temp/')
            cv2.imwrite(shadow_path,shadow)
            continue


    alb_temp = alb.astype(np.float64)
    alb_temp[alb_temp==0] = alb_temp[alb_temp==0]+1e-5
    shadow = np.clip(im.astype(np.float64)/alb_temp,0,1)
    shadow = (shadow*255).astype(np.uint8)

    shadow_path = im_path.replace('img/','shadow/')
    cv2.imwrite(shadow_path,shadow)

    mask_path = im_path.replace('img/','mask/')
    cv2.imwrite(mask_path,mask)

    # cv2.imshow('im',im)
    # cv2.imshow('alb',alb)
    # cv2.imshow('shadow',shadow)
    # cv2.imshow('mask_erode',mask_erode)
    # print(im_min[mask_erode==255])
    # print(metric,metric_num)
    # cv2.waitKey(0)