optimize convolution
preprocess: convert to grayscale
sobel filter
optimization
blur step for canny
first two steps of canny
work on one channel (3 was redundant)
compute gradient magnitude and angle, use non-maximum suppression
hysteresis