Better region centering, randomized samples, fixed merge weights, recalculating center, no more data nesting data
This commit is contained in:
parent
4108069671
commit
ff7455495d
@ -2,10 +2,12 @@ import asyncio
|
||||
import json
|
||||
import logging
|
||||
import pathlib
|
||||
import random
|
||||
import shutil
|
||||
from io import BytesIO
|
||||
from typing import List, Union, Optional
|
||||
|
||||
import numpy
|
||||
from PIL import Image, ImageChops, ImageColor, ImageDraw, ImageFont, ImageOps
|
||||
from PIL.ImageDraw import _color_diff
|
||||
|
||||
@ -136,8 +138,12 @@ def create_number_mask(regions, filepath, filename):
|
||||
w1, h1 = region.center
|
||||
w2, h2 = fnt.getsize(text)
|
||||
|
||||
d2.rectangle((w1 - (w2 / 2), h1 - (h2 / 2)-1, w1 + (w2 / 2)-1, h1 + (h2 / 2)), fill=0)
|
||||
d3.rectangle((w1 - (w2 / 2), h1 - (h2 / 2)-1, w1 + (w2 / 2)-1, h1 + (h2 / 2)), fill=0)
|
||||
d2.rectangle(
|
||||
(w1 - (w2 / 2) - 1, h1 - (h2 / 2) + 5, w1 + (w2 / 2) - 1, h1 + (h2 / 2)), fill=0
|
||||
)
|
||||
d3.rectangle(
|
||||
(w1 - (w2 / 2) - 1, h1 - (h2 / 2) + 5, w1 + (w2 / 2) - 1, h1 + (h2 / 2)), fill=0
|
||||
)
|
||||
d3.text((w1 - (w2 / 2), h1 - (h2 / 2)), text, font=fnt, fill=255)
|
||||
d.text((w1 - (w2 / 2), h1 - (h2 / 2)), text, font=fnt, fill=0)
|
||||
number_img.save(filepath / "numbers.png", "PNG")
|
||||
@ -224,6 +230,31 @@ class ConquestMap:
|
||||
|
||||
return lowest_num, eliminated_masks, mask
|
||||
|
||||
async def sample_region(self, region: int, include_numbered=False):
|
||||
if region not in self.regions:
|
||||
return []
|
||||
|
||||
files = []
|
||||
|
||||
current_map = Image.open(self.blank_path())
|
||||
current_map = await composite_regions(
|
||||
current_map, [region], ImageColor.getrgb("red"), self.masks_path()
|
||||
)
|
||||
|
||||
buffer1 = BytesIO()
|
||||
current_map.save(buffer1, "png")
|
||||
buffer1.seek(0)
|
||||
files.append(buffer1)
|
||||
|
||||
if include_numbered:
|
||||
current_numbered_img = await self.get_numbered(current_map)
|
||||
buffer2 = BytesIO()
|
||||
current_numbered_img.save(buffer2, "png")
|
||||
buffer2.seek(0)
|
||||
files.append(buffer2)
|
||||
|
||||
return files
|
||||
|
||||
async def get_sample(self, region=None):
|
||||
files = [self.blank_path()]
|
||||
|
||||
@ -239,6 +270,8 @@ class ConquestMap:
|
||||
else:
|
||||
regions = list(self.regions.keys())
|
||||
|
||||
random.shuffle(regions) # random lets goo
|
||||
|
||||
fourth = len(regions) // 4
|
||||
|
||||
current_map = await composite_regions(
|
||||
@ -257,7 +290,10 @@ class ConquestMap:
|
||||
self.masks_path(),
|
||||
)
|
||||
current_map = await composite_regions(
|
||||
current_map, regions[fourth * 3 :], ImageColor.getrgb("yellow"), self.masks_path()
|
||||
current_map,
|
||||
regions[fourth * 3 :],
|
||||
ImageColor.getrgb("yellow"),
|
||||
self.masks_path(),
|
||||
)
|
||||
|
||||
current_numbered_img = await self.get_numbered(current_map)
|
||||
@ -385,6 +421,7 @@ class MapMaker(ConquestMap):
|
||||
]
|
||||
|
||||
lowest_region.center = get_center(weighted_points)
|
||||
lowest_region.weight += sum(r.weight for r in elim_regions)
|
||||
|
||||
for key in eliminated:
|
||||
self.regions.pop(key)
|
||||
@ -439,6 +476,30 @@ class MapMaker(ConquestMap):
|
||||
|
||||
return True
|
||||
|
||||
async def recalculate_center(self, region=None):
|
||||
if region is None:
|
||||
for num, r in self.regions.items():
|
||||
|
||||
points = await self.get_points_from_mask(region)
|
||||
|
||||
r.center = get_center(points)
|
||||
else:
|
||||
num = region
|
||||
r = self.regions[num]
|
||||
|
||||
points = await self.get_points_from_mask(region)
|
||||
|
||||
r.center = get_center(points)
|
||||
|
||||
await self.save_data()
|
||||
|
||||
async def get_points_from_mask(self, region):
|
||||
mask: Image.Image = Image.open(self.masks_path() / f"{region}.png").convert("1")
|
||||
arr = numpy.array(mask)
|
||||
found = numpy.where(arr == 0)
|
||||
points = set(list(zip(found[1], found[0])))
|
||||
return points
|
||||
|
||||
|
||||
class Region:
|
||||
def __init__(self, center, weight, **kwargs):
|
||||
@ -447,7 +508,7 @@ class Region:
|
||||
self.data = kwargs
|
||||
|
||||
def get_json(self):
|
||||
return {"center": self.center, "weight": self.weight, "data": self.data.copy()}
|
||||
return {"center": self.center, "weight": self.weight, **self.data}
|
||||
|
||||
|
||||
class Regioner:
|
||||
|
Loading…
x
Reference in New Issue
Block a user