That escalated quickly. Maybe a nicer tone would be appropriate.
Whatever, to the topic: Why should assertions only be for library developers and not for users? First time I hear this. asserts are useful in Java as well; actually they are in every language.
The out-of-bounds error is not a very good example, because -- as Nexus said -- the underlying implementation will most likely(!) spit an error in debug config. However you will have a lot of cases where functions can be misused without going into an obvious error state. These are called "logic errors" -- those kind of errors you have to hunt in the debugger, often for many hours.
Assertions help with this. The developer of a library should evaluate (all) possible input values and give hints how NOT to use functions. Generally one should make it really hard to use your library in a wrong way, but if it's possible, tell the user. This has nothing to do with "C++ noobs", albeit I think that "noobs" also benefit from this.
Addings assertions to get/setPixel() still makes sense as a high-level way of catching errors in my opinion. It makes clear what the function expects as input. A note like "(valid values: 0 to width-1)" will further help, and the assertion triggers when this contract is broken by the user.
How else would you raise an error, especially if no STL container is used underneath that catches the error you missed? Exceptions are no option, because exceptions are only raised when unavoidable errors happen. Error return values? Those are completely unrelated and dangerous (even more dangerous is returning black for invalid getPixel() inputs, as there's no way to distinguish from error or success).
Last, but not least: Assertions are also useful apart from the debugger. Adding a neat little message to the assertion makes the error case expressive, as well:
assert(x < width && y < height && "Coordinate out of bounds.");
For me this is all about added code safety. Whether a "noob" or a "pro" is using a library.