矩阵转换为灰度图像
如下代码所示首先加载一幅图像,转换为矩阵后在转回为图像:

import numpy as np
import Image
mg = Image.open(filename)
mats = np.array(mg)
mg2 = Image.fromarray(mats)

但是以上这样的用法有一些需要注意的地方,将矩阵转换为图像的函数不会自动的对其像素值的大小进行变换,也就是说如果矩阵的值在0到1之间的话,那么最后这幅图像的像素值将会只有0和1,会导致这幅图像的所有像素变得非常的暗。所有可以进行矩阵的尺度变换使得矩阵的最小值对应黑色像素,最大值对应白色像素,代码如下所示将矩阵转换为灰度图像的a2i函数:

import Image
def a2i(indata):
    mg = Image.new('L',indata.transpose().shape)
    mn = indata.min()
    a = indata-mn
    mx = a.max()
    a = a*256./mx
    mg.putdata(a.ravel())
    return mg

灰度图像转换为矩阵

from numpy import array,fromstring,unit8
def i2a(mg):
    H,V = mg.size
    d = fromstring(mg.tostring(),unit8)
    d = d.reshape((V,H))
    return d

RGB图像转换为3个矩阵

#简单的将图像分离为三个通道,并分别调用i2a函数
def RGB2cube(rgbmg):
    r,g,b = rgbmg.split()
    r = i2a(r)
    g = i2a(g)
    b = i2a(b)
    return array([r,g,b])

将3个矩阵转换为RGB图像

def Cube2Image(r,g,b):
    ri = a2i(r)
    gi = a2i(g)
    bi = a2i(b)
    mg = Image.merg('RGB',(ri,gi,bi))
    return mg

这里再提供两个颜色转换函数,即RGB图像与YUV图像格式之间的转换

def RGB2YUV(rr,gg,bb):
    y = 0.299*rr + 0.587*gg + 0.114*bb
    u = -0.147*rr -0.289*gg + 0.436*bb
    v = 0.615*rr - 0.515*gg - 0.100*bb
    return y,u,v

def YUV2RGB(y,u,v):
    r = y - 3.94e-5*u + 1.14*v
    g = y - 0.394*u - 0.581*v
    b = y + 2.032*u - 4.81e-4*v
    return r,g,b