I have found a solution that kind of does the job, although takes three times as much memory.

Every update I calculate the difference between the new and the old saturation matrix, this eliminates 60% of the nonzero values, which means it gets drawn that much faster.

As a second layer of optimization I call repaint with a rectangle describing the most important zone, and call update every 60ms.