возьми самое простое - jpeg, сам алгоритм jpeg как раз сжимает чб картинки (каждый канал цвета он жмет отдельно), просто цветной jpeg переводит картинку из RGB в YCbCr, и последние два канала уменьшает ибо они не так сильно влияют на качество картинки
можно взять сжатие на вейвлетах :
http://iquilezles.org/www/articles/wavelet/wavelet.htm
суть всех алгоритмов :
1) каким-то способом получить АЧХ чтобы выделить информацию к которой глаз наиболее чувствительный (дискретнокосинусное преобразование у jpeg и вейвлеты у jpeg2000)
2) получаем набор целых чисел
3) берем делим их на сколько-то, переводим их в инт и умножает на столько же - таким образом уменьшаем точность, ЭТО ЕДИНСТВЕННОЕ ЧТО ВЛИЯЕТ НА СТЕПЕНЬ СЖАТИЯ И КАЧЕСТВО ИЗОБРАЖЕНИЯ, ибо все остальные операции полностью обратимы и являются losless
4) сжимаем полученные цифры как поток битов, в jpeg для этого используют код хаффмана, в jpeg2000 используют арифметическое кодирование
вот и вся магия
ps. у меня диплом jpeg2000 на cuda, спрашивайте свои ответы