> (define pcb (read-image "pcb1.pgm")) > pcb #<image: rows = 256 cols = 256> >

> (define thresholded-pcb (> pcb 64)) > thresholded-pcb #<image: rows = 256 cols = 256> >

> (define (paint-components labeled v) (image-map (lambda (x) (vector-ref v x)) labeled)) > > (define (area-image labeled) (paint-components labeled (areas labeled))) > > (define holes (< (area-image (label (= thresholded-pcb 0))) 40)) > holes #<image: rows = 256 cols = 256> >

> (define (make-overlay A r g b) (let ((B (outline A))) (rgb->color-image (* r B) (* g B) (* b B)))) > > (define hole-overlay (make-overlay holes 1 1 0)) > hole-overlay #<color-image: rows = 256 cols = 256> >

> (define filled-holes-pcb (+ holes thresholded-pcb)) > filled-holes-pcb #<image: rows = 256 cols = 256> >

> (define rectangular-pads (open filled-holes-pcb (make-vector 11 (make-vector 27 1)))) > rectangular-pads #<image: rows = 256 cols = 256> >

> (define rectangular-pad-overlay (make-overlay rectangular-pads 1 0 0)) > rectangular-pad-overlay #<color-image: rows = 256 cols = 256> >

> (define square-pads (open filled-holes-pcb (make-vector 17 (make-vector 17 1)))) > square-pads #<image: rows = 256 cols = 256>

> (define square-pads-overlay (make-overlay square-pads 0 1 0)) > square-pads-overlay #<color-image: rows = 256 cols = 256>

> (define circle (lambda (x y rr) (lambda (i j) (if (<= (+ (* (- x i) (- x i)) (* (- y j) (- y j))) rr) 1 0)))) > > (define circular-pad (image->array (make-image 19 19 (circle 9 9 79)))) > (array->image circular-pad) #<image: rows = 19 cols = 19> >

> (open filled-holes-pcb circular-pad) #<image: rows = 256 cols = 256> >

> (define no-square-pads (* (= square-pads 0) filled-holes-pcb)) > no-square-pads #<image: rows = 256 cols = 256> >

> (define circular-pads (open no-square-pads circular-pad)) > circular-pads #<image: rows = 256 cols = 256> >

> (define circular-pad-overlay (make-overlay circular-pads 0 0 1)) > circular-pad-overlay #<color-image: rows = 256 cols = 256> >

> (define no-pads (= (+ rectangular-pads square-pads circular-pads) 0)) > no-pads #<image: rows = 256 cols = 256> >

> (define eroded-no-pads (erode no-pads #(#(1 1 1) #(1 1 1) #(1 1 1)))) > eroded-no-pads #<image: rows = 256 cols = 256> >

> (define wires (* eroded-no-pads filled-holes-pcb)) > wires #<image: rows = 256 cols = 256> >

> (define wire-overlay (make-overlay wires 1 0 1)) > wire-overlay #<color-image: rows = 256 cols = 256> >

> (define (color-image+ . args) (define (helper x y) (apply rgb->color-image (map + (color-image->rgb x) (color-image->rgb y)))) (if (null? (cdr args)) (car args) (helper (car args) (apply color-image+ (cdr args))))) > > (color-image+ rectangular-pad-overlay square-pad-overlay circular-pad-overlay wire-overlay hole-overlay) #<color-image: rows = 256 cols = 256> >