矩阵转换为灰度图像
如下代码所示首先加载一幅图像,转换为矩阵后在转回为图像:
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