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