《Python数据分析与展示》-PIL学习笔记03

图像的数组表示

图像是一个由像素组成的二维矩阵,每个元素是一个RGB值

PIL :Python Image Library

PIL库是一个具有强大图像处理能力的第三方库

在命令行下的安装方法: pip install pillow from PIL import Image Image是PIL库中代表一个图像的类(对象)

图像是一个三维数组,维度分别是高度、宽度和像素RGB 值

实例:

In [86]: from PIL import Image

In [87]: im=np.array(Image.open("e:/study_model/beijing.jpg"))

In [88]: print(im.shape,im.dtype)
(333, 500, 3) uint8

图像的变换

原图如下:

 实例1

扫描二维码关注公众号,回复: 2869544 查看本文章
In [89]: b=[255,255,255]-im

In [90]: a=Image.fromarray(b.astype('uint8'))

In [91]: a.save("e:/study_model/beijing2.jpg")

根据以上代码得到如下图片

实例2

In [93]: im=np.array(Image.open("e:/study_model/beijing.jpg").convert('L'))

In [94]: b=255-im

In [95]: a=Image.fromarray(b.astype('uint8'))

In [97]: a.save("e:/study_model/beijing3.jpg")

根据以上代码得到如下图片 

实例3

In [99]: c=(100/255)*im+150

In [101]: a=Image.fromarray(c.astype('uint8'))

In [103]: a.save("e:/study_model/beijing4.jpg")

根据以上代码得到如下图片  

实例4

In [108]: d=255*(im/255)**2

In [109]: a=Image.fromarray(d.astype('uint8'))

In [110]: a.save("e:/study_model/beijing5.jpg")

根据以上代码得到如下图片 

         

“图像的手绘效果”实例介绍

实例代码如下:

In [111]: a=np.asarray(Image.open('e:/study_model/beijing.jpg').convert('L')).astype('float')

In [112]: depth=10.

In [113]: grad=np.gradient(a)

In [114]: grad_x,grad_y=grad

In [115]: grad_x=grad_x*depth/100.

In [116]: grad_y=grad_y*depth/100.

In [117]: A=np.sqrt(grad_x**2+grad_y**2+1.)

In [118]: uni_x=grad_x/A

In [119]: uni_y=grad_y/A

In [120]: uni_z=1./A

In [121]: vec_el=np.pi/2.2

In [122]: vec_az=np.pi/4.

In [123]: dx=np.cos(vec_el)*np.cos(vec_az)

In [124]: dy=np.cos(vec_el)*np.sin(vec_az)

In [125]: dz=np.sin(vec_el)

In [126]: b=255*(dx*uni_x+dy*uni_y+dz*uni_z)

In [127]: b=b.clip(0,255)

In [128]: im=Image.fromarray(b.astype('uint8'))

In [129]: im.save('e:/study_model/beijingHD.jpg')

解析:

梯度的重构

利用像素之间的梯度值和虚拟深度值对图像进行重构 根据灰度变化来模拟人类视觉的远近程度

depth=10.                ←    预设深度值为10      取值范围0-100

grad=np.gradient(a)      ←  提取x和y方向的梯度值

grad_x,grad_y=grad

grad_x=grad_x*depth/100.        ←根据深度调整x和y方向的梯度值

grad_y=grad_y*depth/100.

光源效果

根据灰度变化来模拟人类视觉的远近程度

• 设计一个位于图像斜上方的虚拟光源

• 光源相对于图像的俯视角为Elevation, 方位角为Azimuth

• 建立光源对个点梯度值的影响函数

• 运算出各点的新像素值

np.cos(vec_el)为单位光线在地平面上的投影长度

dx, dy, dz是光源对x/y/z三方向的影响程度

猜你喜欢

转载自blog.csdn.net/nodoself/article/details/81838362