目录
一.图像的数组表示
1.图像的RGB色彩模式
2.PIL库
二.图像变换
1.image转换成array
2.array转换成image
三.图像的手绘效果
1.实例介绍
2.编程实例
RGB三个颜色通道的变化和叠加得到各种颜色,且包括了人类视力所能感受到的所有颜色,其中:
·R 红色,取值范围0~255
·G 绿色,取值范围0~255
·B 蓝色,取值范围0~255
PIL(Python Image Library)库是一个具有强大图像处理能力的第三方库
Image是PIL库中代表一个图像的类
导入方式:
from PIL import Image
图像的数组表示代码实例:
from PIL import Image
import numpy as np
im=np.array(Image.open("C:/Users/myun/Pictures/不知火舞.jpg"))
print(im.shape,im.dtype)
'''(251, 180, 3) uint8'''
图像是一个维数组,维度分别是高度,宽度和像素RGB值
思路:读取图像后,获取像素RGB值,修改后保存为新文件
im=np.asarray(image)
代码:
from PIL import Image
import numpy as np
im=np.asarray(Image.open("C:/Users/myun/Pictures/bl.jpg"))
print(im.shape,im.dtype)
'''(400, 600,3) uint8'''
Image.fromarray(np.uint8(img))
图像变换代码实例:
from PIL import Image
import numpy as np
im=np.array(Image.open("C:/Users/myun/Pictures/bl.jpg"))
print(im.shape,im.dtype)
c=[255,255,255]-im
b=Image.fromarray(c.astype('uint8'))
b.save("C:/Users/myun/Pictures/bl2.jpg")
'''(400, 600,3) uint8'''
效果:
couvert()是图像实例对象的一个方法,接受一个mode参数,用以指定一种色彩模式
·1:1位像素,黑白,每个字节存储一个像素
·L:8位像素,黑白
·P:8位像素,使用调色板映射到任何其他模式
·RGB:3x8位像素,真色彩
·RGBA:4x8位像素,带透明度掩模的真色彩
·CMYK:4x8位像素,分色
·YCbCr:3x8位像素,彩色视频格式
·l:32位有符号整数像素
·F:32位浮点数像素
from PIL import Image
import numpy as np
im=np.array(Image.open("C:/Users/myun/Pictures/bl.jpg").convert('L'))
print(im.shape,im.dtype)
c=255-im
b=Image.fromarray(c.astype('uint8'))
b.save("C:/Users/myun/Pictures/bl1.jpg")
'''(400, 600) uint8'''
效果:
变成:
区间变换:
from PIL import Image
import numpy as np
a=np.asarray(Image.open("C:/Users/myun/Pictures/bl.jpg").convert('L'))
b=(100/255)*a+150 #区间变换
im=Image.fromarray(b.astype('uint8'))
im.save("C:/Users/myun/Pictures/b3.jpg")
效果:
像素平方:
from PIL import Image
import numpy as np
a=np.asarray(Image.open("C:/Users/myun/Pictures/bl.jpg").convert('L'))
b=255*(a/255)**2 #像素平方
im=Image.fromarray(b.astype('uint8'))
im.save("C:/Users/myun/Pictures/b4.jpg")
效果:
手绘图片效果代码:
from PIL import Image
import numpy as np
a=np.asarray(Image.open("C:/Users/myun/Pictures/bl.jpg").convert('L')).astype('float')
depth=10. #0~100
grad=np.gradient(a) #获取图像灰度梯度值
grad_x,grad_y=grad #获取横纵图像梯度值
grad_x=grad_x*depth/100.
grad_y=grad_y*depth/100.
A=np.sqrt(grad_x**2+grad_y**2+1.)
uni_x=grad_x/A
uni_y=grad_y/A
uni_z=1./A
vec_el=np.pi/2.2 #光源的俯视角度,弧度数
vec_az=np.pi/4. #光源的方向角,弧度数
dx=np.cos(vec_el)*np.cos(vec_az) #光源对x轴的影响
dy=np.cos(vec_el)*np.sin(vec_az) #光源对y轴的影响
dz=np.sin(vec_el)
b=255*(dx*uni_x+dy*uni_y+dz*uni_z) #光源归一化
b=b.clip(0,255)
im=Image.fromarray(b.astype('uint8'))
im.save("C:/Users/myun/Pictures/bl4.jpg")
原图:
手绘图: