chore: import upstream snapshot with attribution
This commit is contained in:
@@ -0,0 +1,115 @@
|
||||
|
||||
import cv2
|
||||
import numpy as np
|
||||
from PIL import Image, ImageOps, ImageDraw
|
||||
|
||||
'''
|
||||
PIL resize (W,H)
|
||||
Torch resize is (H,W)
|
||||
'''
|
||||
class VGrid:
|
||||
def __init__(self):
|
||||
pass
|
||||
|
||||
def __call__(self, img, copy=True, max_width=4, mag=-1, prob=1.):
|
||||
if np.random.uniform(0,1) > prob:
|
||||
return img
|
||||
|
||||
if copy:
|
||||
img = img.copy()
|
||||
W, H = img.size
|
||||
|
||||
if mag<0 or mag>max_width:
|
||||
line_width = np.random.randint(1, max_width)
|
||||
image_stripe = np.random.randint(1, max_width)
|
||||
else:
|
||||
line_width = 1
|
||||
image_stripe = 3 - mag
|
||||
|
||||
n_lines = W // (line_width + image_stripe) + 1
|
||||
draw = ImageDraw.Draw(img)
|
||||
for i in range(1, n_lines):
|
||||
x = image_stripe*i + line_width*(i-1)
|
||||
draw.line([(x,0), (x,H)], width=line_width, fill='black')
|
||||
|
||||
return img
|
||||
|
||||
class HGrid:
|
||||
def __init__(self):
|
||||
pass
|
||||
|
||||
def __call__(self, img, copy=True, max_width=4, mag=-1, prob=1.):
|
||||
if np.random.uniform(0,1) > prob:
|
||||
return img
|
||||
|
||||
if copy:
|
||||
img = img.copy()
|
||||
W, H = img.size
|
||||
if mag<0 or mag>max_width:
|
||||
line_width = np.random.randint(1, max_width)
|
||||
image_stripe = np.random.randint(1, max_width)
|
||||
else:
|
||||
line_width = 1
|
||||
image_stripe = 3 - mag
|
||||
|
||||
n_lines = H // (line_width + image_stripe) + 1
|
||||
draw = ImageDraw.Draw(img)
|
||||
for i in range(1, n_lines):
|
||||
y = image_stripe*i + line_width*(i-1)
|
||||
draw.line([(0,y), (W, y)], width=line_width, fill='black')
|
||||
|
||||
return img
|
||||
|
||||
class Grid:
|
||||
def __init__(self):
|
||||
pass
|
||||
|
||||
def __call__(self, img, mag=-1, prob=1.):
|
||||
if np.random.uniform(0,1) > prob:
|
||||
return img
|
||||
|
||||
img = VGrid()(img, copy=True, mag=mag)
|
||||
img = HGrid()(img, copy=False, mag=mag)
|
||||
return img
|
||||
|
||||
class RectGrid:
|
||||
def __init__(self):
|
||||
pass
|
||||
|
||||
def __call__(self, img, isellipse=False, mag=-1, prob=1.):
|
||||
if np.random.uniform(0,1) > prob:
|
||||
return img
|
||||
|
||||
img = img.copy()
|
||||
W, H = img.size
|
||||
line_width = 1
|
||||
image_stripe = 3 - mag #np.random.randint(2, 6)
|
||||
offset = 4 if isellipse else 1
|
||||
n_lines = ((H//2) // (line_width + image_stripe)) + offset
|
||||
draw = ImageDraw.Draw(img)
|
||||
x_center = W // 2
|
||||
y_center = H // 2
|
||||
for i in range(1, n_lines):
|
||||
dx = image_stripe*i + line_width*(i-1)
|
||||
dy = image_stripe*i + line_width*(i-1)
|
||||
x1 = x_center - (dx * W//H)
|
||||
y1 = y_center - dy
|
||||
x2 = x_center + (dx * W/H)
|
||||
y2 = y_center + dy
|
||||
if isellipse:
|
||||
draw.ellipse([(x1,y1), (x2, y2)], width=line_width, outline='black')
|
||||
else:
|
||||
draw.rectangle([(x1,y1), (x2, y2)], width=line_width, outline='black')
|
||||
|
||||
return img
|
||||
|
||||
class EllipseGrid:
|
||||
def __init__(self):
|
||||
pass
|
||||
|
||||
def __call__(self, img, mag=-1, prob=1.):
|
||||
if np.random.uniform(0,1) > prob:
|
||||
return img
|
||||
|
||||
img = RectGrid()(img, isellipse=True, mag=mag, prob=prob)
|
||||
return img
|
||||
Reference in New Issue
Block a user