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.