作者:金良([email protected]) csdn博客:http://blog.csdn.net/u012176591
操作图像数据时常会对数组的维度进行转变,这里贴一下Python的reshape()函数的例子,可以留意一下该函数是怎么进行维度转变的
由于一般操作的图像数据时灰度图像,这里介绍一下灰度图像的概念。
灰度(Gray scale)图像是一种具有从黑到白256级灰度等级(0~255,0表示黑,255表示白)的单色图像。该图像中的每个像素用8位数据表示,因此像素点值介于黑白间的256种灰度中的一种。该图像只有灰度等级,而没有颜色的变化。灰度圖像與黑白圖像不同,在計算機圖像領域中黑白圖像只有黑白兩種顏色,灰度圖像在黑色與白色之間還有許多級的顏色深度。灰度图像与RGB也不同,RGB对每个像素点用Red、Green、Blue三种颜色的值(每个值介于0~255,表示颜色强度)来标记,而不像灰度图一样只用一个表示灰度的值来标记。所以灰度图的数据矩阵是二维的,而RGB图的数据矩阵是三维的,矩阵元素的值都是0~255的整数值。RGB到灰度图的转换,即由R、G、B三个值影射到灰度的算法有不止一种。
操作图像的Python源码,包含了读取图片获得数组,数组的维度变换以及对数组转换成图片三个操作:
def countnum(data):#返回高维数组的元素的个数 dshape = data.shape num=1 for i in range(len(dshape)): num *= dshape[i] return num #获取图像的RGB数据,保存为数组 rgb = numpy.array(img.open('coloredbox.jpg')) #获取图像的灰度数据,保存为数组 gray = numpy.array(img.open('coloredbox.jpg').convert('L')) #数据的维度,前者是三维的,后者是二维的 print "由图像得到的数组:",rgb.shape,gray.shape #RGB数据元素个数 numrgb = countnum(rgb) #灰度数据元素个数 numgray = countnum(gray) #将图像数据保存成一维数据 rgb1 = rgb.reshape(numrgb,1) gray1 = gray.reshape(numgray,1) print "由图像得到的数组转换成一维后:",rgb1.shape,gray1.shape #获取RGB图像的维度信息 d1,d2,d3 = rgb.shape #根据维度信息和一维数组恢复RGB的三维数组 rgb = rgb1.reshape(d1,d2,d3) #获取灰度图像的维度信息 d1,d2 = gray.shape #根据维度信息和一维数组恢复灰度的二维数组 gray = gray1.reshape(d1,d2) print "从一维恢复到原来的维度:",rgb.shape,gray.shape #将灰度的二维数组保存成图像 arrayGray2Image = img.fromarray(gray) arrayGray2Image.save('aa.jpg') #将RGB的三维数组保存成图像 arrayRGB2Image = img.fromarray(rgb) arrayRGB2Image.save('bb.jpg') #读取保存的图像数据信息,查看是否有损失,答案是没有 rgb = numpy.array(img.open('aa.jpg')) gray = numpy.array(img.open('bb.jpg').convert('L')) print "由数组重新生成的图像得到的数组:",rgb.shape,gray.shape
colorbox.jpg
aa.jpg
bb.jpg
几个链接