zoukankan      html  css  js  c++  java
  • Python——彩图变线稿

    思路:

    1、用灰度变化来模拟视觉的明暗程度;

    2、把彩图转为灰度数组;

    3、求出梯度数组,即灰度变化率数组;

    4、预设灰度值10,范围0-100,衰减到10%,这将对灰度变化率按作衰减;

    5、令z变化率为1,对x、y、z的作归一化处理;

    6、定义一个光源,附视角接近90度,方位角45度;

    7、令对角线长度为单位1,分别计算光源在x、y、z轴的投影值;

    8、将归一化并衰减过的灰度变化率,分别乘以对应的投影值,之后相加;

    9、得到灰度系数,再乘以255,即线稿的灰度值;

    10、输出线稿图;

    代码如下:

    #coding=utf-8
    
    from PIL import Image 
    import numpy as np
    
    orgimg = '/Users/chong/Documents/code/ai/gray/t1/res/card_100023.png'
    outimg = '/Users/chong/Documents/code/ai/gray/t1/res/card_100023_gray.png'
    a = np.asarray(Image.open(orgimg).convert('L')).astype('float')
    
    # 根据灰度变化来模拟人类视觉的明暗程度
    depth = 10.             # 预设虚拟深度值为10 范围为0-100 
    grad = 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方向梯度值
    
    # 梯度归一化 定义z深度为1.  将三个梯度绝对值转化为相对值,在三维中是相对于斜对角线A的值
    A = np.sqrt(grad_x ** 2 + grad_y ** 2 + 1.)
    uni_x = grad_x / A 
    uni_y = grad_y / A 
    uni_z = 1./ A
    
    # 令三维中是相对于斜对角线的值为1
    vec_el = np.pi / 2.1                    # 光源俯视角度   弧度值  接近90度
    vec_az = np.pi / 4.                     # 光源方位角度   弧度值  45度
    dx = np.cos(vec_el) * np.cos(vec_az)    # 光源对x轴的影响 对角线在x轴投影
    dy = np.cos(vec_el) * np.sin(vec_az)    # 光源对y轴的影响 对角线在y轴投影
    dz = np.sin(vec_el)                     # 光源对z轴的影响 对角线在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(outimg)       # 保存图片

    运行   python pic-gray.py 

    效果图

      

    相关库安装  pip install numpy

    取灰度图方法

    1. img = img.convert()
      PIL有九种不同模式: 1,L,P,RGB,RGBA,CMYK,YCbCr,I,F。

    1.1 img.convert('1')
      为二值图像,非黑即白。每个像素用8个bit表示,0表示黑,255表示白。

    1.2 img.convert('L')
      为灰度图像,每个像素用8个bit表示,0表示黑,255表示白,其他数字表示不同的灰度。

       转换公式:L = R * 299/1000 + G * 587/1000+ B * 114/1000。

    1.3 img.convert('P')

     ps:

    显示图片

    import matplotlib.pyplot as plt
    plt.figure("preview")
    plt.imshow(Image.open(outimg))
    plt.show()
  • 相关阅读:
    Kindle Book Resource
    Windows远程桌面
    python列表常用方法
    python字符串操作简单方法
    PCA降维实验代码
    android底部菜单栏的编写
    android UI:Fragment碎片
    android开发学习——day8
    android开发学习——day7
    android开发学习——day6
  • 原文地址:https://www.cnblogs.com/xingchong/p/15153488.html
Copyright © 2011-2022 走看看