I believe your looking for Imagemagick's MagickPosterizeImage.
MagickWandGenesis();
MagickWand *wand = NewMagickWand();
NSData *data = UIImagePNGRepresentation(self.originalImage);
MagickReadImageBlob(wand, [data bytes], [data length]);
MagickBooleanType = status;
status = MagickPosterizeImage(wand,6,MagickFalse);
if (status == MagickFalse)
{
NSLog(@"FAIL");
}
// Convert wand back to UIImage
unsigned char * c_blob;
size_t data_length;
c_blob = MagickGetImageBlob(wand,&data_length);
data = [NSData dataWithBytes:c_blob length:data_length];
self.imageView.image = [UIImage imageWithData:data];
DestroyMagickWand(wand);
MagickWandTerminus();
There's also MagickOrderedPosterizeImage & MagickOrderedPosterizeImageChannel to fine-tune dithering thresholds, and target color channels.