So OK you can use cv2.COLOR_RGB2GRAY to get a grayscale image. But what does that teach you?
In my image processing 101 course a couple of years ago we actually didn't use any libraries except for reading images and showing them (written by the teacher). Just Java. A picture would be a 2 dimensional array. The pixel is represented by an integer. So you just need a nested for loop and you can manipulate every pixel yourself, thus learning what really happens under the hood, how filters work.