图像的手绘效果

时间:2022-08-23 07:57:26

图像的RGB色彩模式:

        图像一般使用RGB色彩模式,即每个像素点的颜色由红(R)、绿(G)、蓝(B)组成。

        RGB三个颜色通道的变化和叠加得到各种颜色,其中

        • R 红色,取值范围,0‐255

        • G 绿色,取值范围,0‐255

        • B 蓝色,取值范围,0‐255

        RGB形成的颜色包括了人类视力所能感知的所有颜色。

 

PIL库:

        PIL, Python Image Library

        PIL库是一个具有强大图像处理能力的第三方库,在命令行下的安装方法: pip install pillow

        from PIL import Image

        Image是PIL库中代表一个图像的类(对象)。

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

 

        # 打开图像文件,图像文件是一个RGB值组成的矩阵

        im =np.array(Image.open("beijing.jpg"));

        # (669, 1012, 3)uint8

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

        print(im.shape,im.dtype);

 

图像变换:

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

# -*- coding: utf-8 -*-

import numpy as np
from PIL import Image
import os

# 设置路径为当前路径
path = os.path.dirname(__file__);
os.chdir(path);


# 打开图像文件,图像文件是一个RGB值组成的矩阵
im = np.array(Image.open("beijing.jpg"));
# (669, 1012, 3) uint8
# 图像是一个三维数组,维度分别是高度、宽度和像素RGB值
print(im.shape, im.dtype);


# 图像的变换
# 读入图像后,获得像素RGB值,修改后保存为新的文件
a = np.array(Image.open("fcity.jpg"));
# 像素值取反操作
b = [255, 255, 255] - a;
img1 = Image.fromarray(b.astype('uint8'));
img1.save("fcity1.jpg");

# convert('L')将图像的RGB值转化为一个灰度值
c = np.array(Image.open("fcity.jpg").convert('L'));
d = 255 - c;
img2 = Image.fromarray(d.astype('uint8'));
img2.save("fcity2.jpg");

# 区间变换
e = (100/255)*c + 150;
img3 = Image.fromarray(e.astype('uint8'));
img3.save("fcity3.jpg");

# 像素平方
f = 255*(c/255)**2;
img4 = Image.fromarray(f.astype('uint8'));
img4.save("fcity4.jpg");


图像手绘效果:

# -*- coding: utf-8 -*-

from PIL import Image
import numpy as np
import os

# 设置路径为当前路径
path = os.path.dirname(__file__);
os.chdir(path);

a = np.asarray(Image.open('beijing.jpg').convert('L')).astype('float')

# (0-100)
depth = 10.;
# 取图像灰度的梯度值
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.;
# 光源对x 轴的影响
dx = np.cos(vec_el)*np.cos(vec_az);
# 光源对y 轴的影响
dy = np.cos(vec_el)*np.sin(vec_az);
# 光源对z 轴的影响
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('beijingHD.jpg');

图片素材:

beijing.jpg

图像的手绘效果

fcity.jpg

图像的手绘效果