Initial commit
This commit is contained in:
commit
93f32c5bac
|
@ -0,0 +1 @@
|
||||||
|
.direnv
|
|
@ -0,0 +1,126 @@
|
||||||
|
from PIL import Image, ImageFilter, ImageDraw, ImageEnhance
|
||||||
|
import random
|
||||||
|
import tempfile
|
||||||
|
|
||||||
|
# Thickness of the bars in the third (test) row.
|
||||||
|
# No more than 10
|
||||||
|
RESULTS = [0, 1, 4, 8, 16, 32, 20, 10, 5, 3]
|
||||||
|
# Travel of the bars in the third (test) row.
|
||||||
|
# No more than 10
|
||||||
|
TRAVELS = [0, 0, 0, 3, 3, 3, 2, 1, 0, 4]
|
||||||
|
|
||||||
|
SIZE = (1024, 256)
|
||||||
|
SSHIFT = 16
|
||||||
|
OSIZE = (SIZE[0] + SSHIFT, SIZE[1] + SSHIFT)
|
||||||
|
NNOISEBLOT = random.randrange(128)
|
||||||
|
|
||||||
|
im = Image.new("L", SIZE, "white")
|
||||||
|
draw = ImageDraw.Draw(im)
|
||||||
|
|
||||||
|
# add large/macro noise
|
||||||
|
for _ in range(NNOISEBLOT):
|
||||||
|
noise_blot_x = random.randrange(OSIZE[0])
|
||||||
|
noise_blot_y = random.randrange(OSIZE[1])
|
||||||
|
noise_blot_size = random.randrange(int(max(OSIZE) / 32.0))
|
||||||
|
draw.ellipse([(noise_blot_x, noise_blot_y), (noise_blot_x + noise_blot_size,
|
||||||
|
noise_blot_y +
|
||||||
|
noise_blot_size)], fill=226)
|
||||||
|
|
||||||
|
# blur out macro noise
|
||||||
|
im = im.filter(ImageFilter.SMOOTH)
|
||||||
|
im = im.filter(ImageFilter.MedianFilter(size=3))
|
||||||
|
|
||||||
|
# flip one in four pixels to thwart sharpening
|
||||||
|
draw = ImageDraw.Draw(im)
|
||||||
|
for y in range(OSIZE[1]):
|
||||||
|
for x in range(OSIZE[0]):
|
||||||
|
if random.choice([True, False]):
|
||||||
|
npval = random.randrange(200, 250)
|
||||||
|
draw.point((x, y), fill=npval)
|
||||||
|
|
||||||
|
# average, blur, and desaturate resulting noise to create backdrop
|
||||||
|
im = im.filter(ImageFilter.MedianFilter(size=3))
|
||||||
|
im = im.filter(ImageFilter.GaussianBlur(radius=8))
|
||||||
|
|
||||||
|
BAR_X_MARGIN = OSIZE[0] / 32
|
||||||
|
BAR_HEIGHT = OSIZE[1] / 16
|
||||||
|
BAR_BOUNDING_LEN = (OSIZE[0] - BAR_X_MARGIN) / 16
|
||||||
|
draw = ImageDraw.Draw(im)
|
||||||
|
for line_i in range(int((OSIZE[1] - BAR_HEIGHT) / (BAR_HEIGHT * 4))):
|
||||||
|
for bar_i in range(int((OSIZE[0] - BAR_X_MARGIN) / (BAR_BOUNDING_LEN + BAR_X_MARGIN))):
|
||||||
|
# for the p-control line, increasing concentration across
|
||||||
|
height = bar_i * 2
|
||||||
|
|
||||||
|
# for the n-control line, random very low positives
|
||||||
|
if line_i == 1:
|
||||||
|
height = random.randrange(0, 4)
|
||||||
|
if height < 3:
|
||||||
|
continue
|
||||||
|
height = height - 2
|
||||||
|
|
||||||
|
# for the test line, as indicated
|
||||||
|
if line_i == 2:
|
||||||
|
if len(RESULTS) > bar_i:
|
||||||
|
height = RESULTS[bar_i]
|
||||||
|
else:
|
||||||
|
height = 0
|
||||||
|
if height == 0:
|
||||||
|
continue
|
||||||
|
|
||||||
|
travel = 0
|
||||||
|
if len(TRAVELS) > bar_i:
|
||||||
|
travel = TRAVELS[bar_i]
|
||||||
|
x_offset = random.randrange(int(BAR_BOUNDING_LEN / 3))
|
||||||
|
y_offset = (BAR_HEIGHT - height) / 2 - random.randrange(int(BAR_HEIGHT / 4))
|
||||||
|
start_x = (BAR_BOUNDING_LEN * bar_i) + (BAR_X_MARGIN * (bar_i + 1)) + x_offset
|
||||||
|
start_y = ((line_i + 1) * BAR_HEIGHT * 4) + y_offset - travel
|
||||||
|
draw.rectangle([start_x, start_y, start_x + BAR_BOUNDING_LEN,
|
||||||
|
start_y + height], fill=0)
|
||||||
|
|
||||||
|
if height == 0:
|
||||||
|
continue
|
||||||
|
|
||||||
|
opaq = random.randrange(0, 192)
|
||||||
|
incursion = random.randrange(1, 8)
|
||||||
|
draw.rectangle([start_x + incursion, start_y - 2, start_x + BAR_BOUNDING_LEN - incursion,
|
||||||
|
start_y + height - 2], fill=opaq)
|
||||||
|
draw.rectangle([start_x, start_y + (height/2) - 2, start_x + BAR_BOUNDING_LEN,
|
||||||
|
start_y + (height/2) + 2], fill=0)
|
||||||
|
|
||||||
|
if len(TRAVELS) > bar_i and TRAVELS[bar_i] != 0:
|
||||||
|
start_x = (BAR_BOUNDING_LEN * bar_i) + (BAR_X_MARGIN * (bar_i + 1))\
|
||||||
|
+ x_offset + (BAR_BOUNDING_LEN * 0.10)
|
||||||
|
start_y = ((line_i + 1) * BAR_HEIGHT * 4) + y_offset
|
||||||
|
draw.rectangle([start_x, start_y, start_x + (BAR_BOUNDING_LEN * 0.80),
|
||||||
|
start_y + int(height / 2)], fill=64)
|
||||||
|
|
||||||
|
im = im.filter(ImageFilter.MedianFilter(size=3))
|
||||||
|
|
||||||
|
# draw random bars of white for proceessing noise
|
||||||
|
draw = ImageDraw.Draw(im)
|
||||||
|
n_bars = random.randrange(1, 10)
|
||||||
|
for bar_i in range(int(n_bars)):
|
||||||
|
x = random.randrange(OSIZE[0])
|
||||||
|
width = random.randrange(1, 3)
|
||||||
|
draw.line([x, 0, x + 3, OSIZE[1]], fill=255, width=width)
|
||||||
|
|
||||||
|
n_bars = random.randrange(30, 300)
|
||||||
|
for pbar_i in range(int(n_bars)):
|
||||||
|
x = random.randrange(OSIZE[0])
|
||||||
|
ys = random.randrange(OSIZE[1])
|
||||||
|
l = random.randrange(int(OSIZE[1] / 3))
|
||||||
|
draw.line([x, ys, x, ys + l], fill=255, width=1)
|
||||||
|
|
||||||
|
n_bars = random.randrange(100, 1000)
|
||||||
|
for pbar_i in range(int(n_bars)):
|
||||||
|
y = random.randrange(OSIZE[1])
|
||||||
|
xs = random.randrange(OSIZE[0])
|
||||||
|
l = random.randrange(int(OSIZE[0] / 8))
|
||||||
|
draw.line([xs, y, xs + l, y], fill=255, width=1)
|
||||||
|
|
||||||
|
im = im.filter(ImageFilter.GaussianBlur(radius=3))
|
||||||
|
|
||||||
|
im = im.crop((SSHIFT/2, SSHIFT/2, SIZE[0] - SSHIFT/2, SIZE[1] - SSHIFT/2))
|
||||||
|
f = tempfile.NamedTemporaryFile(suffix=".png", delete=False, delete_on_close=False)
|
||||||
|
im.save(f, format="png")
|
||||||
|
print(f.name)
|
|
@ -0,0 +1,13 @@
|
||||||
|
{ pkgs ? import (fetchTarball {
|
||||||
|
name = "nixos-24.05-2024-05-25";
|
||||||
|
url = "https://github.com/nixos/nixpkgs/archive/d12251ef6e8e6a46e05689eeccd595bdbd3c9e60.tar.gz";
|
||||||
|
sha256 = "0khxvys8iz32pffyqqlch4s6f28vk8wj20d8w29salh2pm35z3yi";
|
||||||
|
}) {} }:
|
||||||
|
|
||||||
|
pkgs.mkShellNoCC {
|
||||||
|
packages = with pkgs; [
|
||||||
|
(python312.withPackages (ps: [
|
||||||
|
ps.pillow
|
||||||
|
]))
|
||||||
|
];
|
||||||
|
}
|
Loading…
Reference in New Issue