Spaces:
Runtime error
Runtime error
import cv2 | |
import numpy as np | |
import torch | |
from skimage.filters.rank import mean_bilateral | |
from skimage import morphology | |
from PIL import Image | |
from PIL import ImageEnhance | |
def padCropImg(img): | |
H = img.shape[0] | |
W = img.shape[1] | |
patchRes = 128 | |
pH = patchRes | |
pW = patchRes | |
ovlp = int(patchRes * 0.125) # 32 | |
padH = (int((H - patchRes) / (patchRes - ovlp) + 1) * (patchRes - ovlp) + patchRes) - H | |
padW = (int((W - patchRes) / (patchRes - ovlp) + 1) * (patchRes - ovlp) + patchRes) - W | |
padImg = cv2.copyMakeBorder(img, 0, padH, 0, padW, cv2.BORDER_REPLICATE) | |
ynum = int((padImg.shape[0] - pH) / (pH - ovlp)) + 1 | |
xnum = int((padImg.shape[1] - pW) / (pW - ovlp)) + 1 | |
totalPatch = np.zeros((ynum, xnum, patchRes, patchRes, 3), dtype=np.uint8) | |
for j in range(0, ynum): | |
for i in range(0, xnum): | |
x = int(i * (pW - ovlp)) | |
y = int(j * (pH - ovlp)) | |
if j == (ynum-1) and i == (xnum-1): | |
totalPatch[j, i] = img[-patchRes:, -patchRes:] | |
elif j == (ynum-1): | |
totalPatch[j, i] = img[-patchRes:, x:int(x + patchRes)] | |
elif i == (xnum-1): | |
totalPatch[j, i] = img[y:int(y + patchRes), -patchRes:] | |
else: | |
totalPatch[j, i] = padImg[y:int(y + patchRes), x:int(x + patchRes)] | |
return totalPatch, padH, padW | |
def illCorrection(model, totalPatch): | |
totalPatch = totalPatch.astype(np.float32) / 255.0 | |
ynum = totalPatch.shape[0] | |
xnum = totalPatch.shape[1] | |
totalResults = np.zeros((ynum, xnum, 128, 128, 3), dtype=np.float32) | |
for j in range(0, ynum): | |
for i in range(0, xnum): | |
patchImg = torch.from_numpy(totalPatch[j, i]).permute(2,0,1) | |
patchImg = patchImg.cuda().view(1, 3, 128, 128) | |
output = model(patchImg) | |
output = output.permute(0, 2, 3, 1).data.cpu().numpy()[0] | |
output = output * 255.0 | |
output = output.astype(np.uint8) | |
totalResults[j, i] = output | |
return totalResults | |
def composePatch(totalResults, padH, padW, img): | |
ynum = totalResults.shape[0] | |
xnum = totalResults.shape[1] | |
patchRes = totalResults.shape[2] | |
ovlp = int(patchRes * 0.125) | |
step = patchRes - ovlp | |
resImg = np.zeros((patchRes + (ynum - 1) * step, patchRes + (xnum - 1) * step, 3), np.uint8) | |
resImg = np.zeros_like(img).astype('uint8') | |
for j in range(0, ynum): | |
for i in range(0, xnum): | |
sy = int(j * step) | |
sx = int(i * step) | |
if j == 0 and i != (xnum-1): | |
resImg[sy:(sy + patchRes), sx:(sx + patchRes)] = totalResults[j, i] | |
elif i == 0 and j != (ynum-1): | |
resImg[sy+10:(sy + patchRes), sx:(sx + patchRes)] = totalResults[j, i,10:] | |
elif j == (ynum-1) and i == (xnum-1): | |
resImg[-patchRes+10:, -patchRes+10:] = totalResults[j, i,10:,10:] | |
elif j == (ynum-1) and i == 0: | |
resImg[-patchRes+10:, sx:(sx + patchRes)] = totalResults[j, i,10:] | |
elif j == (ynum-1) and i != 0: | |
resImg[-patchRes+10:, sx+10:(sx + patchRes)] = totalResults[j, i,10:,10:] | |
elif i == (xnum-1) and j == 0: | |
resImg[sy:(sy + patchRes), -patchRes+10:] = totalResults[j, i,:,10:] | |
elif i == (xnum-1) and j != 0: | |
resImg[sy+10:(sy + patchRes), -patchRes+10:] = totalResults[j, i,10:,10:] | |
else: | |
resImg[sy+10:(sy + patchRes), sx+10:(sx + patchRes)] = totalResults[j, i,10:,10:] | |
resImg[0,:,:] = 255 | |
return resImg | |
def preProcess(img): | |
img[:,:,0] = mean_bilateral(img[:,:,0], morphology.disk(20), s0=10, s1=10) | |
img[:,:,1] = mean_bilateral(img[:,:,1], morphology.disk(20), s0=10, s1=10) | |
img[:,:,2] = mean_bilateral(img[:,:,2], morphology.disk(20), s0=10, s1=10) | |
return img | |
def postProcess(img): | |
img = Image.fromarray(img) | |
enhancer = ImageEnhance.Contrast(img) | |
factor = 2.0 | |
img = enhancer.enhance(factor) | |
return img | |
def rec_ill(net, img, saveRecPath): | |
totalPatch, padH, padW = padCropImg(img) | |
totalResults = illCorrection(net, totalPatch) | |
resImg = composePatch(totalResults, padH, padW, img) | |
#resImg = postProcess(resImg) | |
resImg = Image.fromarray(resImg) | |
resImg.save(saveRecPath) | |