Olá, Pedro!
Sim, a ideia é quantizar a imagem colorida com 4 ou 6 bits por canal de cor. Lembre-se (fizemos isso na última aula) que no Python se M é uma imagem RGB então M[:,:,k] é a imagem correspondente ao k-ésimo canal de cor (k=0,1,2). Se quisermos visualizar por exemplo o canal R separadamente poderíamos fazer:
R=M.copy()
R[:,:,1] = 0 # apaga canal G
R[:,:,2] = 0 # apaga canal B
plt.imshow(R)
Porém, para o exercício 2.2 é possível abordar as imagens coloridas de uma forma completamente transparente em relação aos canais, uma vez que todas as operações aritméticas, e inclusive a norma, se aplicam a estruturas com quantos índices quisermos. Então basta entender as contas que você precisa realizar para quantizar um único pixel em 4 ou 6 bits, e escrever a mesma expressão para a matriz RGB inteira. Em relação à norma, você tem toda a razão, tecnicamente o nome "norma de Frobenius" se aplica a matrizes MxN, e coincide com a norma Euclideana (pensando na matriz como um vetor de M*N elementos). A extensão para matrizes MxNx3 segue exatamente a mesma lógica, e a mesma função do numpy serve para normas de estruturas de quantos índices quisermos. Em particular:
print(np.linalg.norm(M)**2,sum([np.linalg.norm(M[:,:,k])**2 for k in range(3)]))
deve produzir duas vezes o mesmo número (leia-se "a energia da imagem colorida é a soma das energias dos canais de cor").
Uma dica para facilitar a quantização é converter a imagem de inteiros entre 0 e 255 para floats entre 0 e 1 e trabalhar o resto do tempo com floats (o plt.imshow() interpreta corretamente as cores entre 0 e 1). Se quiser voltar para a faixa de 0 a 255, é necessário converter o tipo das entradas (.astype(np.uint8)).
Sobre os quatérnios, não veremos isso nesse curso. Eles são importantes em modelagem de espaços 3D para representar rotações arbitrárias.
Abraços,
Marcelo