• 数据分析与展示——图像手绘效果实现


    NumPy库入门

    NumPy数据存取和函数

    实例:图像的数组表示

    图像的RGB色彩模式

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

    RGB三个颜色通道的变化和叠加得到各种颜色,取值都为0-255。RGB形成的颜色包括了人类视力所能感知的所有颜色。

    PIL(Python Image Library)库

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

    from PIL import Image

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

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

    范例:将数组转化为ndarray数组

    In [1]: from PIL import Image
    
    In [2]: import numpy as np
    
    In [3]: im = np.array(Image.open("E:/tiger.jpg"))
    
    In [4]: print(im.shape,im.dtype)
    (435, 428, 3) uint8

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

    图像的变换

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

    范例:修改图像并另存

    In [5]: b = [255,255,255] - im
    
    In [6]: new_im = Image.fromarray(b.astype('uint8'))
    
    In [7]: new_im.save("E:/tiger1.jpg")
    
    In [8]: a = np.array(Image.open("E:/tiger.jpg").convert('L')) # 使用灰度表示图像
    
    In [9]: b = 255 - a 
    
    In [10]: im = Image.fromarray(b.astype('uint8'))
    
    In [11]: im.save("E:/tiger2.jpg")
    
    In [12]: c = (100/255)*a +150   # 区间变换
    
    In [13]: im = Image.fromarray(c.astype('uint8'))
    
    In [14]: im.save("E:/tiger3.jpg")
    
    In [15]: d = 255 * (a/255)**2  # 像素平方
    
    In [16]: im = Image.fromarray(d.astype('uint8'))
    
    In [17]: im.save("E:/tiger4.jpg")

    tiger.jpg  tiger1.jpg    tiger2.jpg   tiger3.jpg    tiger4.jpg

    “图像的手绘效果”实例分析

    手绘效果特征:

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

    图像手绘效果实现代码:

    from PIL import Image
    import numpy as np
    
    a = np.asarray(Image.open('E:/tiger.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('E:/tiger0.jpg')

     tiger0.jpg

  • 相关阅读:
    Dubbo笔记(二)
    Dubbo笔记(一)
    初识多线程
    Redis底层结构全了解
    用golang刷算法--归并排序算法
    谈谈golang中的channel
    用golang刷算法--快速排序算法
    谈谈golang中的引用类型与地址分配
    Arch安装后的配置(超详细)
    ArchLinux安装(Deepin v20桌面环境)
  • 原文地址:https://www.cnblogs.com/yan-lei/p/7781043.html
Copyright © 2020-2023  润新知