Pixel-Perfect Collision is easily done, but is very expensive in terms of cpu power.
This is how you wold go about doing it:

Every sprite has pixel data that can be accessed, now say the sprite above was your sprite, you'd do a for loop to list through every single pixel in the sprite that is opaque, and check against every single pixel in the other sprite, here's some pseudo-code:
for(i = 0; i < totalPixelsInSprite; i++){
if( pixelIsNotTransparent ){
for(z = 0; z < totalPixelsInOtherSprite; z++){
if( (pixelco_ordinate == otherSpritePixelCo_Ordinate) && (otherSpritePixelIsOpaque)){
// add some code to handle the collision
}
}
}
}
detail about how you access the pixels can be found on this site: getPixel from HTML Canvas?
so the idea is pretty much to get the position of every non-transparent pixel, and then check is against every non-transparent pixel in the other sprite. the actually "checking" is just seeing if the pixel in the first sprite has the same co-ordinates as the pixel in the second sprite.
there are optimisations to be done here, it was a very crude example of pixel collision, first of all you should check if the rectangles of the sprite collide first and then do this detection if the rectangles are colliding, this will save cpu power.