如何详细解析Python实现图像手绘风格转换的技术?

2026-04-30 15:521阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1313个文字,预计阅读时间需要6分钟。

如何详细解析Python实现图像手绘风格转换的技术?

目录 + 图像的数组表示 + 图像的RGB颜色模式 + PIL库 + 图像组合 + 图像变换 + 图像绘制效果 + 绘制效果展示 + 代码展示与讲解 + 图像数组表示 + 图像RGB模式 + RGB模式应用

目录
  • 图像的数组表示
    • 图像的RGB色彩模式
    • PIL库
    • 图像组成
  • 图像的变换
    • 图像的手绘效果
      • 手绘效果展示
      • 代码展示与讲解

    图像的数组表示

    图像的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值,它是(R,G,B)。图像是一个三维数组,维度分别是高度、宽度和像素RGB值。

    from PIL import Image import numpy as np im=np.array(Image.open("beijing.jpg")) print(im.shape,im.dtype)

    它的输出是

    (669, 1012, 3) uint8

    如何详细解析Python实现图像手绘风格转换的技术?

    图像的变换

    我们将会完成在读入图像后,获得像素RGB值,修改后保存为新的文件。

    让我们先来看看对每个像素形成互补的图像:

    from PIL import Image import numpy as np a=np.array(Image.open("beijing.jpg")) b=[255,255,255]-a im=Image.fromarray(b.astype("uint8")) im.save('./new.jpg')

    再来看看图像进行灰度处理后,剩下两个通道。

    from PIL import Image import numpy as np a=np.array(Image.open("beijing.jpg").convert("L")) b=255-a im=Image.fromarray(b.astype("uint8")) im.save('./new.jpg')

    灰度图像后的区间变换

    from PIL import Image import numpy as np a=np.array(Image.open("beijing.jpg").convert("L")) b=(100/255)*a+150 im=Image.fromarray(b.astype("uint8")) im.save('./new.jpg')

    灰度图像后的像素平方

    from PIL import Image import numpy as np a=np.array(Image.open("beijing.jpg").convert("L")) b=255*(a/255)**2 im=Image.fromarray(b.astype("uint8")) im.save('./new.jpg')

    那大家也看到了,我们只需要对其b进行修改即可。

    图像的手绘效果

    手绘效果展示

    手绘效果的几个特征:

    • 黑白灰色
    • 边界线条较重
    • 相同或相近色彩趋于白色
    • 略有光源效果

    代码展示与讲解

    from PIL import Image import numpy as np a = np.asarray(Image.open('./beijing.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) #光源对z 轴的影响 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')

    梯度的重构

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

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

    depth预设深度值为10,其取值范围0‐100,再提取x和y方向的梯度值,根据深度调整x和y方向的梯度值。

    光源效果

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

    • 设计一个位于图像斜上方的虚拟光源
    • 光源相对于图像的俯视角为Elevation,方位角为Azimuth
    • 建立光源对个点梯度值的影响函数
    • 运算出各点的新像素值

    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.sin(vec_az) dz = np.sin(vec_el)

    np.cos(vec_el)为单位光线在地平面上的投影长度,dx, dy, dz是光源对x/y/z三方向的影响程度。

    梯度归一化

    A = np.sqrt(grad_x**2 + grad_y**2 + 1.) uni_x = grad_x/A uni_y = grad_y/A uni_z = 1./A b = 255*(dx*uni_x + dy*uni_y + dz*uni_z)

    A是构造x和y轴梯度的三维归一化单位坐标系,然后梯度与光源相互作用,将梯度转化为灰度

    图像生成

    b = b.clip(0,255) im = Image.fromarray(b.astype('uint8')) #重构图像 im.save('./beijingHD.jpg')

    在这里,为避免数据越界,将生成的灰度值裁剪至0‐255区间

    到此这篇关于Python实现图像手绘效果的方法详解的文章就介绍到这了,更多相关Python图像手绘内容请搜索自由互联以前的文章或继续浏览下面的相关文章希望大家以后多多支持自由互联!

    本文共计1313个文字,预计阅读时间需要6分钟。

    如何详细解析Python实现图像手绘风格转换的技术?

    目录 + 图像的数组表示 + 图像的RGB颜色模式 + PIL库 + 图像组合 + 图像变换 + 图像绘制效果 + 绘制效果展示 + 代码展示与讲解 + 图像数组表示 + 图像RGB模式 + RGB模式应用

    目录
    • 图像的数组表示
      • 图像的RGB色彩模式
      • PIL库
      • 图像组成
    • 图像的变换
      • 图像的手绘效果
        • 手绘效果展示
        • 代码展示与讲解

      图像的数组表示

      图像的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值,它是(R,G,B)。图像是一个三维数组,维度分别是高度、宽度和像素RGB值。

      from PIL import Image import numpy as np im=np.array(Image.open("beijing.jpg")) print(im.shape,im.dtype)

      它的输出是

      (669, 1012, 3) uint8

      如何详细解析Python实现图像手绘风格转换的技术?

      图像的变换

      我们将会完成在读入图像后,获得像素RGB值,修改后保存为新的文件。

      让我们先来看看对每个像素形成互补的图像:

      from PIL import Image import numpy as np a=np.array(Image.open("beijing.jpg")) b=[255,255,255]-a im=Image.fromarray(b.astype("uint8")) im.save('./new.jpg')

      再来看看图像进行灰度处理后,剩下两个通道。

      from PIL import Image import numpy as np a=np.array(Image.open("beijing.jpg").convert("L")) b=255-a im=Image.fromarray(b.astype("uint8")) im.save('./new.jpg')

      灰度图像后的区间变换

      from PIL import Image import numpy as np a=np.array(Image.open("beijing.jpg").convert("L")) b=(100/255)*a+150 im=Image.fromarray(b.astype("uint8")) im.save('./new.jpg')

      灰度图像后的像素平方

      from PIL import Image import numpy as np a=np.array(Image.open("beijing.jpg").convert("L")) b=255*(a/255)**2 im=Image.fromarray(b.astype("uint8")) im.save('./new.jpg')

      那大家也看到了,我们只需要对其b进行修改即可。

      图像的手绘效果

      手绘效果展示

      手绘效果的几个特征:

      • 黑白灰色
      • 边界线条较重
      • 相同或相近色彩趋于白色
      • 略有光源效果

      代码展示与讲解

      from PIL import Image import numpy as np a = np.asarray(Image.open('./beijing.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) #光源对z 轴的影响 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')

      梯度的重构

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

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

      depth预设深度值为10,其取值范围0‐100,再提取x和y方向的梯度值,根据深度调整x和y方向的梯度值。

      光源效果

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

      • 设计一个位于图像斜上方的虚拟光源
      • 光源相对于图像的俯视角为Elevation,方位角为Azimuth
      • 建立光源对个点梯度值的影响函数
      • 运算出各点的新像素值

      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.sin(vec_az) dz = np.sin(vec_el)

      np.cos(vec_el)为单位光线在地平面上的投影长度,dx, dy, dz是光源对x/y/z三方向的影响程度。

      梯度归一化

      A = np.sqrt(grad_x**2 + grad_y**2 + 1.) uni_x = grad_x/A uni_y = grad_y/A uni_z = 1./A b = 255*(dx*uni_x + dy*uni_y + dz*uni_z)

      A是构造x和y轴梯度的三维归一化单位坐标系,然后梯度与光源相互作用,将梯度转化为灰度

      图像生成

      b = b.clip(0,255) im = Image.fromarray(b.astype('uint8')) #重构图像 im.save('./beijingHD.jpg')

      在这里,为避免数据越界,将生成的灰度值裁剪至0‐255区间

      到此这篇关于Python实现图像手绘效果的方法详解的文章就介绍到这了,更多相关Python图像手绘内容请搜索自由互联以前的文章或继续浏览下面的相关文章希望大家以后多多支持自由互联!