一、图像的 RGB 色彩模式
- 图像一般使用 RGB 色彩模式,即每个像素点的颜色由红R绿G蓝B三个通道组成
- RGB三个颜色通道的变化和叠加得到各种颜色,其中红绿蓝的取值范围都是0-255
- RGB形成的颜色包括了人类视力所能感知的所有颜色
二、Python的 PIL 库
- Python Imaging Library ( PIL ) 给 Python 增加了图像处理能力。这个库提供了广泛的文件格式支持,高效的内部展现,以及十分强大的图像处理能力。
- 图像存储:PIL设计用于图像归档和图像批量处理,你可以使用它建立缩略图,转换格式,打印图片等等。现在的版本可以验证和读取大量的图片格式。而写入有意设计为只能写入常用的文件格式。
- 图像显示:现在的版本包含了 Tk PhotoImage 和 BitmapImage 接口,以及 Windows DIB interface,这有助于在 Windows 下使用。为了方便测试,还提供了 show() 方法,可以保存图像到磁盘并显示。
- 图像处理:这个库包含了基本的图像处理功能,包括点操作,使用内置卷积内核过滤,色彩空间转换。这个库还支持更改图像大小、旋转、自由变换。有一个直方图方法允许你统计图像,这可以用于对比度增强和全局统计分析。
PIL库是一个具有强大图像处理能力的 Python 第三方库,在 Anaconda 中是已经安装好的,命令行下安装方法如下:
pip install pillow -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
三、图像的数组表示
图像是一个由像素组成的二维矩阵,每一个元素是一个 RGB 值。
fromPILimportImageimportnumpyasnpim=np.array(Image.open(r'D:\test\001.jpg')) # 打开一个图片 生成数组对象print(im.shape, im.dtype) # 输出结果# (854, 960, 3) uint8
图像是一个三维数组,维度分别表示高度、宽度、和像素 RGB 值。
四、图像的变换
图像可以表示为数组,而数组是可以运算的,经过运算后的数组可以改变图像形状,对图像进行变换。读入图像后,获得像素 RGB 的值,修改后保存为新的文件。
原始图片如下:
计算 RGB 三个通道的补值,得到新的图像。
fromPILimportImageimportnumpyasnpa=np.array(Image.open(r'D:\test\001.jpg')) # 打开一个图片 生成数组对象print(a.shape, a.dtype) b= [255, 255, 255] -a# 计算RGB三个通道的补值im=Image.fromarray(b.astype('uint8')) # 重新生成图片对象im.save(r'D:\test\002.jpg') # 保存为新的jpg图片
效果如下:
将一个彩色图像变成灰度值的图像,再对灰度值取反。
fromPILimportImageimportnumpyasnp# 调用convert('L') 将一个彩色图片变成灰度值的图片a=np.array(Image.open(r'D:\test\001.jpg').convert('L')) # 打开一个图片 生成数组对象 得到灰度值print(a.shape, a.dtype) c=255-a# 对灰度值取反im=Image.fromarray(c.astype('uint8')) im.save(r'D:\test\003.jpg')
效果如下:
对图像做区间变换
fromPILimportImageimportnumpyasnpa=np.array(Image.open(r'D:\test\001.jpg').convert('L')) # 打开一个图片 生成数组对象 得到灰度值print(a.shape, a.dtype) d= (100/255) *a+150# 区间变换im=Image.fromarray(d.astype('uint8')) im.save(r'D:\test\004.jpg')
效果如下:
图像像素平方
fromPILimportImageimportnumpyasnpa=np.array(Image.open(r'D:\test\001.jpg').convert('L')) # 打开一个图片 生成数组对象 得到灰度值print(a.shape, a.dtype) e=255* (a/255) **2# 像素平方im=Image.fromarray(e.astype('uint8')) im.save(r'D:\test\005.jpg')
效果如下:
五、图像的手绘效果实现
图像手绘效果的特征:黑白灰色、边界线条较重、相同或相近色彩趋于白色、略有光源效果。手绘风格是在对图像进行灰度化的基础上由立体效果和明暗效果叠加而成的,灰度实际代表了图像的明暗变化,而梯度表示的灰度的变化率。所以可以通过调整像素的梯度值来间接改变图像的明暗程度,立体效果则通过添加虚拟深度值来实现。
fromPILimportImageimportnumpyasnpa=np.asarray(Image.open(r'D:\test\001.jpg').convert('L')).astype('float') # 根据灰度变化来模拟人类视觉的明暗程度depth=10.# 预设虚拟深度值为10 范围为0-100grad=np.gradient(a) # 提取梯度值grad_x, grad_y=grad# 提取x y方向梯度值 解构赋给grad_x,grad_y# 利用像素之间的梯度值和虚拟深度值对图像进行重构grad_x=grad_x*depth/100.grad_y=grad_y*depth/100.# 根据深度调整 x y 方向梯度值A=np.sqrt(grad_x**2+grad_y**2+1.) uni_x=grad_x/Auni_y=grad_y/Auni_z=1./Avec_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) # 光源对z轴影响b=255* (dx*uni_x+dy*uni_y+dz*uni_z) # 光源归一化b=b.clip(0, 255) # 为了避免数据越界,将生成辉度值裁剪至0-255区间im=Image.fromarray(b.astype('uint8')) # 图像重构im.save(r'D:\test\006.jpg') # 保存图片
图像手绘效果如下:
本文为看了网课视频后的学习总结,也参考了网上其他的文章,测试图片来源于网络,仅用于学习交流之用。