zoukankan      html  css  js  c++  java
  • Python——图像手绘效果

    1、图像的RGB色彩模式

    PIL

    PILPython Image Library

    PIL库是一个具有强大图像处理能力的第三方库

    在命令行下的安装方法: pip install pillow

    from PIL import Image

    ImagePIL库中代表一个图像的类(对象)

    from PIL import Image
    
    import numpy as np
    
    im=np.array(Image.open(r"C:UsersAdministratorDesktop	img.jpg"))
    
    print(im.shape,im.dtype)
    

    可以看出图像是一个三维数组,800行,1200列,每一个点分别是RGB三个值。

    2、图像的变换  

    (1)

    b=[255,255,255]-im
    
    a=Image.fromarray(b.astype('uint8'))%生成新的图像三维数组
    
    a.save(r"C:UsersAdministratorDesktop	img_2.jpg")

     (2)

    模式L”为灰色图像,它的每个像素用8个bit表示,0表示黑,255表示白,其他数字表示不同的灰度。在PIL中,从模式“RGB”转换为“L”模式是按照下面的公式转换的:

    L = R * 299/1000 + G * 587/1000+ B * 114/1000

    下面我们将图像转换为“L”图像。

    a=np.array(Image.open(r"C:UsersAdministratorDesktop	img.jpg"))
    
    b=np.array(Image.open(r"C:UsersAdministratorDesktop	img.jpg").convert('L'))
    
    c=Image.fromarray(b.astype('uint8'))
    
    c.save(r"C:UsersAdministratorDesktop	img_5.jpg")
    

     

    RGB三个数变为了一个数。

    (3)

    a=np.array(Image.open(r"C:UsersAdministratorDesktop	img.jpg").convert('L'))%变为灰度值图片
    
    a
    Out[12]: 
    array([[104, 104, 104, ..., 145, 145, 145],
           [104, 104, 104, ..., 145, 145, 145],
           [104, 104, 104, ..., 145, 145, 145],
           ..., 
           [ 70,  78,  79, ...,  73,  65,  78],
           [ 72,  79,  78, ...,  76,  49,  83],
           [ 73,  71,  69, ..., 118,  76,  97]], dtype=uint8)
    
    b=255-a
    
    b
    Out[14]: 
    array([[151, 151, 151, ..., 110, 110, 110],
           [151, 151, 151, ..., 110, 110, 110],
           [151, 151, 151, ..., 110, 110, 110],
           ..., 
           [185, 177, 176, ..., 182, 190, 177],
           [183, 176, 177, ..., 179, 206, 172],
           [182, 184, 186, ..., 137, 179, 158]], dtype=uint8)
    
    im=Image.fromarray(b.astype('uint8'))
    
    im.save(r"C:UsersAdministratorDesktop	img_3.jpg")

    (4)

    d=255*(a/255)**2  %平方变换
    
    im=Image.fromarray(d.astype('uint8'))
    
    im.save(r"C:UsersAdministratorDesktop	img_4.jpg")

    (5)

    d=(100/255)*a+150%区间变换
    
    im=Image.fromarray(d.astype('uint8'))
    
    im.save(r"C:UsersAdministratorDesktop	img_4.jpg")  

    2、图像手绘效果分析

    手绘效果的几个特征:

    黑白灰色

    边界线条较重

    相同或相近色彩趋于白色

    略有光源效果

     (1)梯度重构

    利用像素之间的梯度值和虚拟深度值对图像进行重构

    (2)光源效果

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

    (3)

    (4)

    from PIL import Image
    import numpy as np
    
    a = np.asarray(Image.open(r"C:UsersAdministratorDesktop	img.jpg").convert('L')).astype('float')
    
    depth = 10. 					
    grad = np.gradient(a)			       #梯度值,	
    grad_x, grad_y = grad 			
    grad_x = grad_x*depth/100.       #列梯度值*0.1
    grad_y = grad_y*depth/100.
    
    A = np.sqrt(grad_x**2 + grad_y**2 + 1.)  #相当于grad_z=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) dy = np.cos(vec_el)*np.sin(vec_az) dz = np.sin(vec_el) #长度为1,投影x,y,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(r"C:UsersAdministratorDesktop img_6.jpg")

     

    数据变化过程如下

    目的其实是将数据两级化,要么黑要么白,更好凸显手绘的感觉

    x,y梯度变化越大,,则z的梯度比例越小,此时求出的变化后的灰度值越小,颜色越黑。

    相反,则灰度值越大,越白,将黑白分明就显示出来了。

  • 相关阅读:
    二分思想判断数组中是否有两数和为sum
    VC中#pragma warning指令
    (转)预编译头文件
    成为一名优秀程序员所需要知道的那些事
    SetThreadAffinityMask设置使用多核CPU的哪个核心
    DirectX 3D 设备丢失(lost device)的处理
    转载 CreateWaitableTimer和SetWaitableTimer函数
    转赵青《剑侠情缘网络版》开发回顾
    转载使用PostThreadMessage在Win32线程间传递消息
    VC使用CRT调试功能检测内存泄漏
  • 原文地址:https://www.cnblogs.com/ruo-li-suo-yi/p/7745673.html
Copyright © 2011-2022 走看看