The problem might be that a .jpg file is read differently by different image readers.
For example, scipy.io.imread() reads a jpg image with a different decoder level than cv2.imread(). Mayble PIL might also read a jpg image with a different decoder level.
That’s why I asked you to try with a png image.
A PNG image is not compressed and it will be read the same way whether it is from PIL or opencv.
The only possibility might be that the channels could be read in reverse mode.