I assume your "island" is actually a rectangular image that you display using a QGraphicsPixmapItem. So if you call any of the methods that return the boundaries (like boundingRect() or shape()) that's just going to return a rectangle. I am guessing that you have already discovered this.

If there is a clear distinction between "land" and "sea" in your island images, you could write some code to determine a QPainterPath that does represent the outline of the model. A generally simple way to do this is to start at one edge of the pixmap and move towards the center. When the pixel value changes from "sea" to "land", you know you have landed on shore and can then begin walking around the island. Your current pixel location is in the center of a 9-membered square (center plus up, down, left, right, and the diagonals between them). You know that behind you is sea and ahead of you is probably land, so go left and check the pixel "above" you. If it is still land, check the pixels around you to make sure you aren't marching further inland but are sticking to shore (one or more of the pixels must always be sea). Make a line segment from the first and current position, add it to the path, and move on. Eventually, if you keep moving left you will end up back where you started and your QPainterPath will represent the actual outline of the island. You can then map the pixel positions in the path to scene coordinates and place your rocks accurately.

If you wanted to, you could derive a IslandPixmapItem from QGraphicsPixmapItem and re-implement the shape() method to return this path. That would make it easier to do other things, like determine when your ship has run aground.