The images are usually not stored in the chain and rather, it decreases the transaction costs. A JSON file can be the creation of output once the images are uploaded to ipfs through the use of pinata. This helps in marking it and uploading the image on pinata. Additionally, the tokenURI is nothing but the same JSON file as mentioned in the example below:-
TokenURI=ipfs://<json_file_hash>"
Then in your JSON file:
{ "image": "<image_file_hash>" }