Why image is more blurred through PIL?
Some parts of the code are missing that might contain clues (e.g. you plot method would only plot random noise, as it stands). What might be happening is that you are showing the image in matplotlib in a figure that is much smaller than the image, so matplotlib will automatically scale the image to the pixel space.

The plt.imshow() method can take an argument interpolation, which can produce dramatically different effects. Here are them all compared side-by-side:



Have a look at the relevant documentation



I personally stick to using OpenCV and cv2.imread() to load images. You just have to be aware (in the context of using Tensorflow/Keras) that the channel are the first dimension. i.e. (Channels, Height, Width) - whereas e.g. plt.imread() will return (Height, Width, Channels).