|
|
|
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 |
|
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 |
|
|