First, Texture vs TextureRegion:
When you do something like Texture t = new Texture(path), you are loading that into GPU. In addition, you should load power of 2 textures. You could work with other resolutions (Texture.setEnforcePotImages = false), but it's encouraged to use pow of 2.
Now, TextureRegion, takes a "piece" from a Texture, no matter it's dimension. The advantage of having one Texture and multiple TextureRegion of that Texture, is that you are NOT loading every region into GPU.
As you may be thinking, when you want to draw with the SpriteBatch, it's much more efficient to use TextureRegion instead of multiple Textures, I'm sorry my english is not good enough. Here is a good explanation: Textures TextureRegion & SpriteBatch
Now, you want to use TextureRegion and one single image in power of 2 resolution with all the spritesheets and images. Do you have to create TextureRegions with all the coordinates and dimensions? Do you need to open paint to count pixels? Noooo, you don't. You can use something like TexturePacker. It will pack every texture into one image AND create a .pack file with de dimensions and coordinates of all of them.
The result will be something like this:
Instead of creating a Texture, create a TextureAtlas, like this:
Now, creating your TextureRegions would be as simple as:
(Note that the name of the region is the name of the original image without the extension).
Sprite holds the geometry, color, and texture information for drawing 2D sprites using Batch. This mean, you can easily rotate them and move. I've created my own Entity class, and I don't need Sprite class. You would probably do the same. I don't find this class really usefull.
Image class inherits from Actor. This mean you can add it into a stage. It's part of the Scene2D package. If your are new to libgdx, and you don't know about this package, this is enough information for you about this class. It's a really interesting topic, but not to answer in this question.
Hope it helps :)