利用Numpy和PIL进行图像的简单处理

用Numpy和PIL进行图像的简单处理

使用PIL库(Python Image Library)
Image是PIL库的一个类,一个Image可以看成一个对象

from PIL import Image
import numpy as np

图像的数组表示

图像是一个由像素组成的二维矩阵,每个元素是一个RGB值。
以本地图片fcity.jpg为例

利用Numpy和PIL进行图像的简单处理
im = np.array(Image.open("img/fcity.jpg"))
print(im.shape, im.dtype)
(1080, 1920, 3) uint8

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

图像的变换

读入图像后,获得像素的RGB值,修改后保存为新的文件。


im_arr = [255, 255, 255] - im
im_new = Image.fromarray(im_new.astype('uint8'))
im_new.save("img/fcity2.jpg")

处理过后的图像:

利用Numpy和PIL进行图像的简单处理

也可以将彩色图片变灰,模式”L”为灰色图像,它的每个像素用8个bit表示,0表示黑,255表示白,其他数字表示不同的灰度。在PIL中,从模式”RGB”转换为”L”模式是按照下面的公式转换的:
L = R ⋅ 299 / 1000 + G ⋅ 587 / 1000 + B ⋅ 114 / 1000 L = R \cdot 299/1000 + G \cdot 587/1000+ B \cdot 114/1000 L =R ⋅2 9 9 /1 0 0 0 +G ⋅5 8 7 /1 0 0 0 +B ⋅1 1 4 /1 0 0 0


im = np.array(Image.open("img/fcity.jpg").convert('L'))
im_arr = 255 - im
im_new2 = Image.fromarray(im_arr.astype('uint8'))
im_new2.save("img/fcity3.jpg")

处理过后的图像:

利用Numpy和PIL进行图像的简单处理

im = np.array(Image.open("img/fcity.jpg").convert('L'))
im_arr = (100/255)*im + 150
im_new3 = Image.fromarray(im_arr.astype('uint8'))
im_new3.save("img/fcity4.jpg")

处理后的图像:

利用Numpy和PIL进行图像的简单处理

im = np.array(Image.open("img/fcity.jpg").convert('L'))
im_arr = 255 * (im/255)**2
im_new3 = Image.fromarray(im_arr.astype('uint8'))
im_new3.save("img/fcity5.jpg")

利用Numpy和PIL进行图像的简单处理

手绘效果

手绘风格是在对图像进行灰度化的基础上由立体效果和明暗效果叠加而成。灰度值代表图像的明暗变化,而梯度值表示灰度的变化率,所以可以通过像素的梯度值间接改变图片的明暗程度,立体效果则通过添加虚拟深度值来实现。
梯度的重构:利用像素之间的梯度值和虚拟深度值对图像进行重构,根据灰度变化来模拟人类视觉的明暗程度。
光源效果模型如下图所示:

利用Numpy和PIL进行图像的简单处理
假设一个虚拟位置的光源,建立光源对各个点梯度值的影响函数,运算出各点的新像素值。
im = np.asarray(Image.open("img/fcity.jpg").convert('L')).astype('float')

depth = 10.

grad = np.gradient(im)
grad_x, grad_y = grad
grad_x = grad_x * depth/100.

grad_y = grad_y * depth/100.

sq = np.sqrt(grad_x**2 + grad_y**2 + 1.)
uni_x = grad_x/sq
uni_y = grad_y/sq
uni_z = 1./sq

vec_el = np.pi/2.2
vec_az = np.pi/4.

dx = np.cos(vec_el)*np.cos(vec_az)
dy = np.cos(vec_el)*np.cos(vec_az)
dz = np.sin(vec_el)

im_arr = 255*(dx*uni_x + dy*uni_y + dz*uni_z)
im_arr = im_arr.clip(0,255)

im_new = Image.fromarray(im_arr.astype('uint8'))
im_new.save("img/fcityHD.jpg")

处理后的图像:

利用Numpy和PIL进行图像的简单处理

Original: https://blog.csdn.net/weixin_45912931/article/details/123689408
Author: 若痕辰
Title: 利用Numpy和PIL进行图像的简单处理

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/758527/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球