I have dabbled with some dithering algorithms and while this is way faster than my naive js implementations, this looks pretty bad
I think the noise is also way too 'soft'. At high frequencies it just becomes near-uniform gray so it barely affects the thresholding.
#dither-demo img.dithered { filter: url(#dither) grayscale(1); }