Python Imaging Library
O Python Imaging Library (PIL) é uma biblioteca Python para que você possa escrever programas que abram e manipule imagens de maneira simples e ao mesmo tempo poderosa.
Se você está usando Python como alternativa ao PHP, vai querer usar o PIL como alternativa à GD.
Vou mostrar aqui as principais funções da PIL.

angie.jpg, Angelina Jolie e a Python
Nos exemplos eu vou usar essa foto acima, angie.jpg.
Abrindo uma imagem
O primeiro código abre uma imagem, diz a largura e altura da imagem e o modo de indexação das cores.
import Image
im = Image.open("angie.jpg")
print im.size, im.mode
Isso vai retornar:
(389, 410) RGB
Ou seja, a largura é de 389 pixels, a altura é de 410 pixels. O formatura de indexação das cores é RGB.
Miniatura
Agora vamos abrir a imagem e fazer uma miniatura de tamanho 128×128 com nome miniatura_angie.jpg.
import Image
im = Image.open("angie.jpg")
im.thumbnail((128,128))
im.save("miniatura_angie.jpg")
Isso vai gerar essa imagem:

miniatura_angie.jpg
Miniatura com antialiasing
Podemos fazer a mesma miniatura usando suavização (Antialias):
import Image
tamanho = 128,128
nome = "angie.jpg"
im = Image.open(nome)
im.thumbnail(tamanho, Image.ANTIALIAS)
im.save("miniatura_"+nome)

miniatura_angie.jpg com suavização
A diferença é sensÃvel:

A da esquerda é sem antialias, a da direita é com
Converter um BMP para JPEG
Basta abrir o arquivo e depois salvar ele com codificação JPG. No caso, vamos abrir uma imagem chamada flor.bmp e salva-la como flor.jpg.
import Image
im = Image.open("flor.bmp")
im.save("flor.jpg", "JPEG")
Convertendo um monte de arquivos para JPG
Agora suponha que você tenha um diretório cheio de arquivos bmp e quer passar tudo para jpg de uma só vez.
import os
import Image
cwd = os.getcwd()
for arquivo in os.listdir(cwd):
if arquivo.endswith('.bmp'):
im = Image.open(arquivo)
nome = arquivo.split('.')[0]
im.save(nome+".jpg", "JPEG")
A função getcwd do módulo os nos fornece o diretório de onde o programa foi chamado, guardamos isso em cwd. Para todo arquivo naquele diretório nos, testamos se ele termina com .bmp. Se sim, nos abrimos ele, pegamos a parte do nome que vem antes do .bmp e salvamos ele com a extensão .jpg. Eu já falei sobre o método split num post anterior.
O mesmo raciocÃnio desse programa pode ser empregado para se criar, por exemplo, miniaturas de todos os arquivos de um diretório.
Rotacionando uma imagem
import Image
img = Image.open("miniatura_angie.jpg")
img2 = img.rotate(45)
img3 = img.rotate(60)
img4 = img.rotate(90)
img2.save("angie_45.jpg")
img3.save("angie_60.jpg")
img4.save("angie_90.jpg")
A miniatura seguida dos arquivos angie_45, angie_60 e angie_90:
Escrevendo um texto na imagem
O Image tem vários sub módulos, um para cada classe de funcionalidade. O ImageDraw provê desenho de primitivas e de texto. Aqui eu uso a fonte padrão do Image, para mais fontes e tamanhos você deve ver o ImageFont.
import Image
import ImageDraw
img = Image.open("angie.jpg")
draw = ImageDraw.Draw(img)
texto = "www.eupodiatamatando.com"
pos = 50,50
draw.text(pos, texto)
img.save("angie_com_texto.jpg")
Nós abrimos uma imagem, instânciamos um Draw daquela imagem e colocamos um texto na posição 50,50, a contar do canto superior esquerdo da imagem.

Aplicação de texto sobre imagem
Operações pixel a pixel
Vou abrir a imagem da Angelina, fazer dela uma miniatura de 128×128 e aplicar algumas funções.
A imagem tem um método point, onde você pode passar uma função para ser aplicada em todos os pontos. Vamos criar funções de uma linha usando o lambda.
import Image
angie = Image.open("angie.jpg")
angie.load()
angie.thumbnail((128,128))
img2 = angie.point(lambda i: i * 2.0)
img3 = angie.point(lambda i: i < 100 and 255)
img4 = angie.point(lambda i: i * 0.5)
img5 = angie.point(lambda i: i**2)
img2.save("angie2.jpg")
img3.save("angie3.jpg")
img4.save("angie4.jpg")
img5.save("angie5.jpg")
A miniatura original seguida dos 4 resultados:
Bem, dá pra fazer muito mais com o PIL. Dê uma olhada no tutorial oficial ou no Handbook para conhecer os outros módulos.
Instalação no Linux
Procure o pacote python-imaging. Em geral:
apt-get install python-imaging
Instalação no Windows
Há um instalador EXE aqui. Antes de baixar verifique a versão do seu Python.
Uma ótima maneira de aprender mais são com livros de Como Programar em Python pelos menores preços que você encontra no Buscapé.
