From 78a951a319af0f7e9e557bc5d74bad7c45f490b7 Mon Sep 17 00:00:00 2001 From: Matthias Bisping Date: Mon, 16 Jan 2023 18:42:34 +0100 Subject: [PATCH] [WIP] random plot segments --- test/fixtures/page_generation/page.py | 85 ++++++++++++++++++++++++--- 1 file changed, 76 insertions(+), 9 deletions(-) diff --git a/test/fixtures/page_generation/page.py b/test/fixtures/page_generation/page.py index c6ed34c..1233db6 100644 --- a/test/fixtures/page_generation/page.py +++ b/test/fixtures/page_generation/page.py @@ -1,5 +1,8 @@ +import io +import itertools import random import textwrap +from itertools import repeat from typing import Tuple, Union, Iterable, List import albumentations as A @@ -9,6 +12,7 @@ import pytest from PIL import Image, ImageOps, ImageFont, ImageDraw from PIL.Image import Transpose from faker import Faker +from matplotlib import pyplot as plt from cv_analysis.utils import star, rconj @@ -69,7 +73,22 @@ Image_t = Union[Image.Image, np.ndarray] # ], # p=0.5, # ) -from funcy import juxt, compose, identity, lflatten, lmap, first, iterate, take, last, rest, rcompose +from funcy import ( + juxt, + compose, + identity, + lflatten, + lmap, + first, + iterate, + take, + last, + rest, + rcompose, + pairwise, + interleave, + keep, +) from cv_analysis.locations import TEST_PAGE_TEXTURES_DIR @@ -341,8 +360,59 @@ class ContentGenerator: def __init__(self): pass - def __call__(self, boxes: Iterable[Rectangle]) -> Image: - return lmap(generate_random_text_block, boxes) + def __call__(self, boxes: List[Rectangle]) -> Image: + random.shuffle(boxes) + + text_boxes = lmap(generate_random_text_block, every_nth(boxes, 2)) + plots = lmap(generate_random_plot, every_nth(boxes[1:], 2)) + + return text_boxes + plots + + +def every_nth(iterable, n): + return itertools.islice(iterable, 0, None, n) + + +def generate_random_plot(rectangle: Rectangle) -> ContentRectangle: + block = RandomPlot(*rectangle.coords) + block.generate_random_bar_plot(rectangle) + return block + + +class RandomPlot(ContentRectangle): + def __init__(self, x1, y1, x2, y2): + super().__init__(x1, y1, x2, y2) + + def __call__(self, *args, **kwargs): + pass + + def generate_random_bar_plot(self, rectangle: Rectangle): + + fig, ax = plt.subplots() + x = np.random.randint(low=1, high=11, size=5) + y = np.random.randint(low=1, high=11, size=5) + + ax.bar(x, y) + + ax.set_xlabel("X-axis") + ax.set_ylabel("Y-axis") + ax.set_title("Random Bar Plot") + ax.set_facecolor("none") + + buf = io.BytesIO() + plt.savefig(buf, format="png", transparent=True) + buf.seek(0) + image = Image.open(buf) + image = image.resize((rectangle.width, rectangle.height)) + buf.close() + plt.close() + self.content = image + + +def generate_random_text_block(rectangle: Rectangle) -> ContentRectangle: + block = RandomTextBlock(*rectangle.coords) + block.generate_random_text(rectangle) + return block class RandomTextBlock(ContentRectangle): @@ -351,6 +421,9 @@ class RandomTextBlock(ContentRectangle): self.blank_line_percentage = random.uniform(0, 0.5) self.font = ImageFont.load_default() + def __call__(self, *args, **kwargs): + pass + def generate_random_text(self, rectangle: Rectangle): def write_line(line, line_number): draw.text((0, line_number * text_size), line, font=self.font, fill=(0, 0, 0, 200)) @@ -398,12 +471,6 @@ class RandomTextBlock(ContentRectangle): return line -def generate_random_text_block(rectangle: Rectangle) -> ContentRectangle: - block = RandomTextBlock(*rectangle.coords) - block.generate_random_text(rectangle) - return block - - def paste_content(page, content_box: ContentRectangle): assert page.mode == "RGB" assert content_box.content.mode == "RGBA"