Found this algorithm by accident. Each pixel is an 8-bit value (0-255). At each iteration, each pixel value is replaced by one less than the average of its four nearest neighbors.

Since unsigned 8-bit values wrap, zeros go back to 255, so there is no stable solution.

One more thing: the pixel array is calculated in-place, not double-buffered, as it probably should be. So changes from one iteration to the next are not perfect; that's why waves tend to propagate toward the upper-left. I think it just looks better than the other way.