Why is my CNN activation maximization split vertically?
I'm answering this myself as it may be helpful to others.
The error is in this line:
outputs = [o[0] for o in output]

I had copied and pasted this from dense-layer visualization code, where it is correct, selecting class 0 for visualization. Here, it is not wrong, but what it does is select the top row of that conv layer across all filters (and not the first filter of that layer). Hence the many small-scale features near the top row, more large-scale features near the middle, and nothing more near the bottom. I believe this may nicely visualize the perceptive field of the network.
For the record,
outputs = [o[:, :, 0] for o in output]

yields expected output.