实验课程之使用Python处理图片尺寸和角度

119 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第16天,点击查看活动详情

1)图片的像素矩阵表示:

数字图像数据可以用矩阵来表示,因此可以采用矩阵理论和矩阵算法对数字图像进行分析和处理。最典型的例子是灰度图像。灰度图像的像素数据就是一个矩阵,矩阵的行对应图像的高(单位为像素),矩阵的列对应图像的宽(单位为像素),矩阵的元素对应图像的像素,矩阵元素的值就是像素的灰度值。

在计算机数字图像处理程序中,通常用二维数组来存放图像数据。二维数组的行对应图像的高,二维数组的列对应图像的宽,二维数组的元素对应图像的像素,二维数组元素的值就是像素的灰度值。采用二维数组来存储数字图像,符合二维图像的行列特性,同时也便于程序的寻址操作,使得计算机图像编程十分方便。

图像的位图数据是一个二维数组(矩阵),矩阵的每一个元素对应了图像的一个像素,当保存一幅图像时,不但要保存图像的位图数据矩阵,还要将每个像素的颜色保存下来,颜色的记录是利用颜色表来完成的。颜色表,也叫颜色查找表,是图像像素数据的颜色索引表。以一个4色位图为例,则其颜色表有4个表项,表中每一行记录一种颜色的R、G、B值,这样,当表示一个像素的颜色时,只需要指出该颜色在第几行,即该颜色在表中的索引值即可。

2)Python语句调整图片的尺寸和角度时,首先要调用Image模块中的im=Image.open( "xxx.jpg" )语句打开指定的预处理图片,并调用im.size和im.resize记录并调整图片的尺寸,调用im.rotate语句调整图片的角度,最后调用im.convert实现图片格式的转换。

此实验部分实现代码如下

import Image

im = Image.open( "messi.jpg" )

print im.size

width = 200

ratio = float(width)/im.size[0]

height = int(im.size[1]*ratio)

nim1 = im.resize( (width, height), Image.BILINEAR )

print nim1.size

nim1.save( "resize.jpg" )

nim2 = im.rotate( 45, Image.BILINEAR )

nim2.save( "rotated45.jpg" )

nim3 = im.rotate( 90, Image.BILINEAR )

nim3.save( "rotated90.jpg" )

gray_img = im.convert("L")

gray_img2= gray_img.resize((128,128),Image.BILINEAR)

print gray_img2.histogram()

在该实验中,学生需用前述的图片处理方法对指定图片的尺寸和角度进行调整,并在此基础上,思考如何实现调整其他图片参数的方法,记录Python代码,并分析实验结果。

4 、实验步骤****

设计图片处理方法的程序

l  分析实验要求

l  实现指定图片的尺寸和角度进行调整

l  记录程序代码

l  记录并分析实验结果

实验过程

1. ****从PIL导入Image库

2. ****打开一张图片,以150为宽度,等比例缩小图像,并保存

3. ****图像旋转45°保存

4. ****图像旋转90°保存

5. 图像转换为灰度图像并保存

PIL有九种不同模式:

1: 1位像素,黑白,每字节一个像素存储

L: 8位像素,黑白

P: 8位像素,使用调色板映射到任何其他模式

RGB: 3x8位像素,真彩色

RGBA: 4x8位像素,带透明度掩模的真彩色

CMYK: 4x8位像素,分色

YCbCr: 3x8位像素,彩色视频格式

I: 32位有符号整数像素

F: 32位浮点像素

6. 打印图像的颜色直方图值

****

7. 进行实验

8. 实验代码

 from PIL import Image  
   
 img=Image.open( "G:\LLP CUIT\cuit_base.jpg" )#打开一个图片  
 print('图像大小'+str(img.size))  
 width = 150  
 ratio = float(width)/img.size[0]  
 height = int(img.size[1]*ratio)  
 nim1 = img.resize( (width, height), Image.BILINEAR )#缩小图像  
 print('图像大小'+str(nim1.size))  
nim1.save( "G:\LLP CUIT\cuit_base_resize.jpg" )  
nim2 = img.rotate( 45, Image.BILINEAR )#旋转45°  
nim2.save( "G:\LLP CUIT\cuit_base_rotated45.jpg" )  
nim3 = img.rotate( 90, Image.BILINEAR )#旋转90°  
nim3.save( "G:\LLP CUIT\cuit_base_rotated90.jpg" )  
#模式“L”为灰色图像,它的每个像素用8个bit表示,0表示黑,255表示白,  
#其他数字表示不同的灰度。在PIL中,从模式“RGB”转换为“L”模式是按照下面的公式转换的:  
#L = R * 299/1000 + G * 587/1000+ B * 114/1000  
gray_img = img.convert("L")  
gray_img.save( "G:\LLP CUIT\cuit_base_gray.jpg" )  
gray_img2= gray_img.resize((128,128),Image.BILINEAR)  
#打印  
print(gray_img2.histogram()) 
 

9. 实验代码效果

image.png