from PIL import Image
# PIL.Imageで画像を開く
img = Image.open("./Mandrill.bmp")
palette = []
for i in range(0, 64):
palette.append(i) # R
palette.append(i) # G
palette.append(i) # B
for i in range(64, 128):
palette.append(0) # R
palette.append(0) # G
palette.append(255) # B
for i in range(128, 192):
palette.append(0) # R
palette.append(255) # G
palette.append(0) # B
for i in range(192, 256):
palette.append(255) # R
palette.append(0) # G
palette.append(0) # B
img.putpalette(palette)
# 画像の表示
img.show()
ただし、一般的には元画像から出力先へのアフィン変換で考える場合が多いので、元画像から出力先へのアフィン変換行列(affine)を計算して、最後にアフィン変換行列の逆行列(affine-1)をtransform()メソッドの data へ渡します。
つまり、変換前の座標を(x, y)、変換後の座標を(x’, y’)とすると、アフィン変換の行列は
$$\left(\begin{array}{c}x^{‘}\\ y^{‘}\\ 1\end{array}\right)=
\left(\begin{array}{c}a & b & c\\ d & e & f \\ 0 & 0 & 1\end{array}\right)
\left(\begin{array}{c}x\\ y \\ 1\end{array}\right)$$
となりますが、この逆の変換を計算し、
$$\left(\begin{array}{c}x\\ y\\ 1\end{array}\right)=
\left(\begin{array}{c}a & b & c\\ d & e & f \\ 0 & 0 & 1\end{array}\right)^{-1}
\left(\begin{array}{c}x^{‘}\\ y^{‘} \\ 1\end{array}\right)$$
から、逆行列の部分を
$$\left(\begin{array}{c}a^{‘} & b^{‘} & c^{‘}\\ d^{‘} & e^{‘} & f^{‘} \\ 0 & 0 & 1\end{array}\right)=
\left(\begin{array}{c}a & b & c\\ d & e & f \\ 0 & 0 & 1\end{array}\right)^{-1}$$