溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

如何用Python畫(huà)了一組手繪圖

發(fā)布時(shí)間:2021-10-28 18:14:10 來(lái)源:億速云 閱讀:209 作者:柒染 欄目:編程語(yǔ)言

今天就跟大家聊聊有關(guān)如何用Python畫(huà)了一組手繪圖,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

這幾天,許多城市,迎來(lái)了2019年的第一場(chǎng)雪

13日早晨,當(dāng)北京市民拉開(kāi)窗簾時(shí)發(fā)現(xiàn),窗外雪花紛紛揚(yáng)揚(yáng)在空中飄落

而且越下越大,樹(shù)上、草地、屋頂、道路上...都落滿(mǎn)雪花

京城銀裝素裹,這是今冬以來(lái)北京迎來(lái)的第二場(chǎng)降雪

一下雪,北京就變成了北平,故宮就變成了紫禁城

八萬(wàn)張門(mén)票在雪花飄下來(lái)之前,便早已預(yù)訂一空

看著朋友圈、微博好友都在紛紛曬圖,小編只能羨慕不已。

不過(guò),戀習(xí)Python突然想到,可以通過(guò)Python將故宮的建筑物圖片,轉(zhuǎn)化為手繪圖(素描效果)。效果圖如下:

如何用Python畫(huà)了一組手繪圖

一、概念與原理

我們都知道手繪圖效果的特征主要有:

  • 黑白灰色;邊界線(xiàn)條較重;相同或相近色彩趨于白色;略有光源效果

核心原理:利用像素之間的梯度值和虛擬深度值對(duì)圖像進(jìn)行重構(gòu),根據(jù)灰度變化來(lái)模擬人類(lèi)視覺(jué)的模擬程度

把圖像看成二維離散函數(shù),灰度梯度其實(shí)就是這個(gè)二維離散函數(shù)的求導(dǎo),用差分代替微分,求取圖像的灰度梯度。常用的一些灰度梯度模板有:Roberts 梯度、Sobel 梯度、Prewitt 梯度、Laplacian 梯度。

以Sobel 梯度計(jì)算來(lái)解釋?zhuān)?/strong>

首先計(jì)算出 如何用Python畫(huà)了一組手繪圖如何用Python畫(huà)了一組手繪圖,然后計(jì)算梯度角 

如何用Python畫(huà)了一組手繪圖梯度方向及圖像灰度增大的方向,其中梯度方向的梯度夾角大于平坦區(qū)域的梯度夾角。如下圖所示,灰度值增加的方向梯度夾角大,此時(shí)梯度夾角大的方向?yàn)樘荻确较?。?duì)應(yīng)在圖像中尋找某一點(diǎn)的梯度方向即通過(guò)計(jì)算該點(diǎn)與其8鄰域點(diǎn)的梯度角,梯度角最大即為梯度方向。

如何用Python畫(huà)了一組手繪圖

二、圖像的數(shù)組形式與變換

如何用Python畫(huà)了一組手繪圖

其中,需要用到的方法:

  • Image.open( ): 打開(kāi)圖片

  • np.array( ) : 將圖像轉(zhuǎn)化為數(shù)組

  • convert("L"): 將圖片轉(zhuǎn)換成二維灰度圖片

  • Image.fromarray( ): 將數(shù)組還原成圖像uint8格式

代碼如下:

from PIL import Image
import numpy as np

im = Image.open(r"C:\Users\Administrator\Desktop\gugong\微信圖片_20190216152248.jpg").convert('L')
a=np.asarray(im).astype('float')
print(a.shape,a.dtype)
(1080, 608) float64
#(1080, 608)分別表示高度,寬度

三、圖像的手繪效果處理

實(shí)現(xiàn)思路步驟:

1、梯度的重構(gòu)

numpy的梯度函數(shù)的介紹

np.gradient(a) : 計(jì)算數(shù)組a中元素的梯度,f為多維時(shí),返回每個(gè)維度的梯度 

離散梯度: xy坐標(biāo)軸連續(xù)三個(gè)x軸坐標(biāo)對(duì)應(yīng)的y軸值:a, b, c 其中b的梯度是(c-a)/2 

而c的梯度是: (c-b)/1

當(dāng)為二維數(shù)組時(shí),np.gradient(a) 得出兩個(gè)數(shù)組,第一個(gè)數(shù)組對(duì)應(yīng)最外層維度的梯度,第二個(gè)數(shù)組對(duì)應(yīng)第二層維度的梯度。 

代碼如下:

grad=np.gradient(a)
grad_x,grad_y=grad
grad_x = grad_x * depth / 100.#對(duì)grad_x值進(jìn)行歸一化
grad_y = grad_y * depth / 100.#對(duì)grad_y值進(jìn)行歸一化

2、構(gòu)造guan光源效果

設(shè)計(jì)一個(gè)位于圖像斜上方的虛擬光源
光源相對(duì)于圖像的視角為Elevation,方位角為Azimuth
建立光源對(duì)各點(diǎn)梯度值的影響函數(shù)
運(yùn)算出各點(diǎn)的新像素值

如何用Python畫(huà)了一組手繪圖

其中:

np.cos(evc.el) : 單位光線(xiàn)在地平面上的投射長(zhǎng)度

dx,dy,dz :光源對(duì)x,y,z三方向的影響程度

3、梯度歸一化

  • 構(gòu)造x和y軸梯度的三維歸一化單位坐標(biāo)系;

  • 梯度與光源相互作用,將梯度轉(zhuǎn)化為灰度。

4、圖像生成

具體詳情代碼如下:

from PIL import Image
import numpy as np
import os
import join
import time

def image(sta,end,depths=10):
    a = np.asarray(Image.open(sta).convert('L')).astype('float')
    depth = depths  # 深度的取值范圍(0-100),標(biāo)準(zhǔn)取10
    grad = np.gradient(a)  # 取圖像灰度的梯度值
    grad_x, grad_y = grad  # 分別取橫縱圖像梯度值
    grad_x = grad_x * depth / 100.#對(duì)grad_x值進(jìn)行歸一化
    grad_y = grad_y * depth / 100.#對(duì)grad_y值進(jìn)行歸一化
    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)  # 光源對(duì)x 軸的影響
    dy = np.cos(vec_el) * np.sin(vec_az)  # 光源對(duì)y 軸的影響
    dz = np.sin(vec_el)  # 光源對(duì)z 軸的影響
    b = 255 * (dx * uni_x + dy * uni_y + dz * uni_z)  # 光源歸一化
    b = b.clip(0, 255)
    im = Image.fromarray(b.astype('uint8'))  # 重構(gòu)圖像
    im.save(end)

def main():
    xs=10
    start_time = time.clock()
    startss = os.listdir(r"C:\Users\Administrator\Desktop\gugong")
    time.sleep(2)
    for starts in startss:
        start = ''.join(starts)
        sta = 'C:/Users/Administrator/Desktop/gugong/' + start
        end = 'C:/Users/Administrator/Desktop/gugong/' + 'HD_' + start
        image(sta=sta,end=end,depths=xs)

    end_time = time.clock()
    print('程序運(yùn)行了  ----' + str(end_time - start_time) + '   秒')
    time.sleep(3)

main()
程序運(yùn)行了  ----43.01828205879955   秒  #一共35張圖片

最終效果圖對(duì)比:

如何用Python畫(huà)了一組手繪圖

其他圖片就不一一列舉。

看完上述內(nèi)容,你們對(duì)如何用Python畫(huà)了一組手繪圖有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI