Since your canal is a straight line (presumably straight off north?), it's easy to separate each side by an SSS, or get position (in texture) + X to scaler. Then you can assign a vector displacement map or redirect to each side separately, displacing X and -X. Same with an image map or mix. As you wrote, but didn't try yet.
Btw, positive on one side and negative on the other doesn't matter if you use perlin or an image map where you can't really tell what's negative or positive, but that would be difficult for cracks.
Alternatively, use a mix of fake stones. But it would take some experimentation to get the right rock on sides and botttom, so indeed you need some clever masking, and without needing more than 1 compute terrain preferably.