Yes, it is needed. Images by default generate inline boxes. Inline boxes are by default aligned so that the text baselines line up. An image doesn’t have a baseline, so the bottom of the image box will align against the text baseline of the cell. The baseline is always a few pixels above the bottom of the cell box, to leave room for the descenders of lowercase letters like ‘g’ and ‘y’.
Therefore, there will be a gap between the bottom of the image and the bottom of the cell if you use the default settings. If you don’t want the gap you must tell the browser to align the image to the bottom of the cell (or use display:block to make it generate a block-level box instead).
The height of your table cell is just a minimum height. If the content requires more space, the cell will expand. And your image needed 25px + a few pixels.
I know, but I swear to you if you take that white space out of the html there will not be a gap under the image. Try your code then mine in dreamweaver. I had this problem a few years ago. It takes all those spaces in your html between the imag tag and </td> and adds a character space under the image.