zoukankan      html  css  js  c++  java
  • Python项目1:实现将图片转化为手绘效果

    先上代码

     1 from PIL import Image
     2 import numpy as np
     3 
     4 a = np.asarray(Image.open(r'C:Usersjian12.guoDesktop	upianmingren.jpeg').convert('L')).astype('float')
     5 depth = 10.  # (0-100)
     6 grad = np.gradient(a)                                # 取图像灰度的梯度值
     7 grad_x, grad_y = grad                                # 分别取横纵图像梯度值
     8 grad_x = grad_x * depth / 100.
     9 grad_y = grad_y * depth / 100.
    10 A = np.sqrt(grad_x ** 2 + grad_y ** 2 + 1.)
    11 uni_x = grad_x / A
    12 uni_y = grad_y / A
    13 uni_z = 1. / A
    14 
    15 vec_el = np.pi / 2.2                                # 光源的俯视角度,弧度值
    16 vec_az = np.pi / 4.                                # 光源的方位角度,弧度值
    17 dx = np.cos(vec_el) * np.cos(vec_az)                      # 光源对x 轴的影响
    18 dy = np.cos(vec_el) * np.sin(vec_az)                      # 光源对y 轴的影响
    19 dz = np.sin(vec_el)                                # 光源对z 轴的影响
    20 
    21 b = 255 * (dx * uni_x + dy * uni_y + dz * uni_z)               # 光源归一化
    22 b = b.clip(0, 255)
    23 
    24 im = Image.fromarray(b.astype('uint8'))                    # 重构图像
    25 im.save(r'C:Usersjian12.guoDesktop	upianmingren1.jpeg')

    代码讲解

    1.我们来观察一下L矩阵,可以看出第4行 a是一个二维浮点型矩阵,因此它的梯度grad里应该有两个数组矩阵,分别对应两层维度的梯度。现取最外层维度梯度为x方向的梯度值grad_x,取第二层维度梯度值为y方向梯度值grad_y

    grad_x, grad_y = grad

    2.这时我们已经取得了图像的梯度值,就可以通过改变像素的梯度值来改变图像的灰度变化,对图像进行重构了。我们先设一个深度值depth,取值范围为(0,100),然后利用深度调整x和y方向的梯度值。

    深度值越小,重构后的图像梯度值越小,即图像灰度值变化越小,画面线条越少,整体更显洁净。

    grad_x = grad_x * depth / 100.
    grad_y = grad_y * depth / 100.

    3.制造光源效果:类似版画的效果,这是因为此时的图像还没有光源效果,跟我们实际观察事物的感觉不一样,因此我们还需要为图像制造光源效果。如图,我们先假设一个光源位于图像斜上方,设俯视角为el,方位角为az,则单位光线在x,y,z方向上的投影长度分别为:通过多次调整发现,当俯视角el=π/2.2, 方位角az=π/4时光照效果最好。(当然对于不同图像两个角度的选取不一定相同)

    实现代码参考:第5行~第21行
     
    4.重构图像:由于灰度值的选取范围为(0,255),为了避免数据越界,需要将生成的灰度值裁剪至0-255之间
    b = b.clip(0, 255)

    由新的灰度值重构图像

    im = Image.fromarray(b.astype('uint8'))

    其中uint8是一种数据类型。这时图像的手绘化效果已经完成了。

    参考链接:https://www.jianshu.com/p/dae4032a86a4

     
  • 相关阅读:
    tp-link便携式路由器固件升级方式
    awk改变了OFS,$0却没变化
    RBAC设计前期设计
    微信小程序获取普通二维码
    微信小程序获取请求数据
    微信小程序获取二维码API
    php之策略模式
    php之简单工厂模式
    数据库转换微信菜单
    实现微信公众号平台菜单功能
  • 原文地址:https://www.cnblogs.com/mrgavin/p/12456933.html
Copyright © 2011-2022 走看看