最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python趣味編程實現(xiàn)手繪風視頻示例

 更新時間:2021年10月08日 15:16:02   作者:小張Python  
本文與計算機視覺相關,使用Python將圖片由自然風轉化為手繪風,期間未對圖片進行任何預處理、后處理;代碼中只借助了兩個常見庫,核心計算由Numpy負責 ,Pillow 負責圖片讀寫

在正文開始之前,先看一下最初效果,下面是單張圖片轉換前后對比

圖一

圖片

圖二

圖片

圖三

圖片

為了增加趣味性,后面將這段代碼應用到一個視頻中,加上一個背景音樂,新鮮的 “手繪風視頻” 出爐

Python 手繪風視頻制作!

“手繪風”實現(xiàn)步驟

講解之前,需要了解手繪圖像的三個主要特點:

  • 圖片需為灰度圖,是單通道的;
  • 邊緣部分線條較重涂抹為黑色,相同或相近像素值轉換后趨于白色;
  • 在光源效果的加持下,灰度變化可模擬人類視覺的遠近效果

讀取圖片,轉化為數(shù)組

因為后面要用到像素計算,為了方便,事先將讀取后的圖片轉化為數(shù)組

a = np.asarray(Image.open("Annie1.jpg").convert('L')).astype('float')

計算 x,y,z 軸梯度值,并歸一化

剛才提到手繪照片的一個特點,就是 手繪照片對邊緣區(qū)域更加側重,定位圖片邊緣部分,最有效方式就是計算梯度,用灰度變化來模擬圖片遠近效果,depth 表示預設深度,z 軸默認梯度為 1

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

加入光源效果

手繪風圖片除了計算梯度值之外,還需要考慮光源影響;根據(jù)光源入射的角度不同最有對x,y,z 各軸上的梯度值有不同程度的影響,添加一個模擬光源,放置在斜上方,與 x , y 分別形成兩個夾角

圖片

并且這兩個夾角是通過實驗得到是已知的,然后根據(jù)正弦余弦函數(shù)計算出最終新的像素值

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)  # 光源歸一化,8 255
b = b.clip(0, 255)# 對像素值低于0,高于255部分做截斷處理

導出圖片,并保存

im.save("Annie_shouhui.jpg")

以下是該步驟涉及到的的全部代碼

from PIL import Image
import numpy as np
a = np.asarray(Image.open("Annie1.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("Annie_shouhui.jpg")

制作手繪風視頻

圖片轉化后的效果雖然也不錯,但圖片畢竟是靜態(tài)的,人作為視覺動物,如果能做成動態(tài)的那再好不過了,知道上面的方法之后,只需對視頻再加上一個拆幀合并操作,就能制作一個手繪風 視頻效果

you-get 下載視頻

這里我用 you-get 命令在 B 站上找了一個視頻,下載了下來,

you-get --format=dash-flv -o ./ https://www.bilibili.com/video/BV1tT4y1j7a9?from=search&8014393453748720686

圖片

下載完之后,用 OpenCV2 對視頻進行切幀操作,切幀同時對圖片進行轉化,寫出到本地視頻文件中

 vc = cv2.VideoCapture(video_path)
    c = 0
    if vc.isOpened():
        rval,frame = vc.read()
        height,width = frame.shape[0],frame.shape[1]
        print(height, width)
    else:
        rval = False
        height,width = 960,1200
    # jpg_list = [os.path.join('Pic_Directory/',i) for i in os.listdir('Pic_Directory') if i.endswith('.jpg')]
    fps = 24 # 視頻幀率
    video_path1 = './text.mp4'
    video_writer = cv2.VideoWriter(video_path1,cv2.VideoWriter_fourcc(*'mp4v'),fps,(width,height))
    while rval:
        rval,frame = vc.read()# 讀取視頻幀
        img = coonvert_jpg(Image.fromarray(frame))
        frame_converted = np.array(img)
        # 轉化為三通道
        image = np.expand_dims(frame_converted,axis = 2)
        result_arr = np.concatenate((image,image,image),axis = -1)
        video_writer.write(result_arr)
        print('Sucessfully Conveted---------{}'.format(c))
        c = c + 1
        if c >= 3000:
            break
    video_writer.release()

在圖片序列提取時,需要注意一點,因為轉化后的圖片是單通道的,直接借助 OpenCV 生成視頻序列是無法播放的,需增加一個步驟單通道轉化為三通道!

 # 轉化為三通道
 image = np.expand_dims(frame_converted,axis = 2)
 result_arr = np.concatenate((image,image,image),axis = -1)

想讓生成的視頻更有感覺的話可以添加一個背影音樂,借助剪輯軟件、Python 都可,這里建議最好用剪輯軟件,原因是 Python 自定義增加音頻效果并不理想,添加音樂時需要有實時反饋, 而 Python 暫時無法滿足此要求

小結

本文主要介紹了如何用 Python將一張圖片轉化為手繪風格,代碼量很少但涉及知識領域與數(shù)學、物理相關,所以不容易理解,本篇文章目的只是為了向大家介紹圖片手繪風轉換有這么一種方法,當然如果有感興趣的小伙伴可以深究一下

好了以上就是本篇文章的全部內容了,最后感謝大家的閱讀,我們下期見,希望大家以后多多支持腳本之家!

相關文章

  • 淺析Python中的方法重載

    淺析Python中的方法重載

    方法重載在?Python?中起著至關重要的作用,?這篇文章主要為大家詳細介紹了Python中方法重載及其優(yōu)點的相關知識,感興趣的小伙伴快跟隨小編一起學習一下吧
    2023-10-10
  • Windows安裝Anaconda并且配置國內鏡像的詳細教程

    Windows安裝Anaconda并且配置國內鏡像的詳細教程

    我們在學習 Python 的時候需要不同的 Python 版本,關系到電腦環(huán)境變量配置換來換去很是麻煩,所以這個時候我們需要一個虛擬的 Python 環(huán)境變量,這篇文章主要介紹了Windows安裝Anaconda并且配置國內鏡像教程,需要的朋友可以參考下
    2023-01-01
  • Django對接elasticsearch實現(xiàn)全文檢索的示例代碼

    Django對接elasticsearch實現(xiàn)全文檢索的示例代碼

    搜索是很常用的功能,如果是千萬級的數(shù)據(jù)應該怎么檢索,本文主要介紹了Django對接elasticsearch實現(xiàn)全文檢索的示例代碼,感興趣的可以了解一下
    2021-08-08
  • 火遍全網(wǎng)的Python二次元特效輕松掌握

    火遍全網(wǎng)的Python二次元特效輕松掌握

    本篇文章介紹了用python編寫的二次元特效變化小程序,詳細介紹了整個思路和過程以及代碼,通讀本篇對大家的學習或工作具有一定的價值,需要的朋友可以參考下
    2021-09-09
  • Pandas替換NaN值的方法實現(xiàn)

    Pandas替換NaN值的方法實現(xiàn)

    本文主要介紹了Pandas替換NaN值的方法實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-01-01
  • Python多線程 Queue 模塊常見用法

    Python多線程 Queue 模塊常見用法

    Python的Queue模塊提供一種適用于多線程編程的FIFO實現(xiàn)。它可用于在生產者(producer)和消費者(consumer)之間線程安全(thread-safe)地傳遞消息或其它數(shù)據(jù),因此多個線程可以共用同一個Queue實例。Queue的大?。ㄔ氐膫€數(shù))可用來限制內存的使用
    2021-07-07
  • 在Linux命令行中運行Python腳本的流程步驟

    在Linux命令行中運行Python腳本的流程步驟

    Python是一種高級編程語言,被廣泛應用于數(shù)據(jù)科學、機器學習、Web 開發(fā)等領域,在Linux操作系統(tǒng)中,Python是一個默認安裝的解釋器,用戶可以通過命令行界面(CLI)來運行Python腳本,在本文中,我們將詳細介紹如何在Linux命令行中運行Python腳本,需要的朋友可以參考下
    2023-11-11
  • Python時間序列處理之ARIMA模型的使用講解

    Python時間序列處理之ARIMA模型的使用講解

    今天小編就為大家分享一篇關于Python時間序列處理之ARIMA模型的使用講解,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • python中for in的用法詳解

    python中for in的用法詳解

    這篇文章主要介紹了python中for in的用法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-04-04
  • django admin管理工具自定義時間區(qū)間篩選器DateRangeFilter介紹

    django admin管理工具自定義時間區(qū)間篩選器DateRangeFilter介紹

    這篇文章主要介紹了django admin管理工具自定義時間區(qū)間篩選器DateRangeFilter介紹,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05

最新評論

巫溪县| 乌恰县| 新丰县| 台安县| 牡丹江市| 南皮县| 永靖县| 苗栗市| 武川县| 邳州市| 文成县| 彭州市| 荆门市| 内乡县| 金塔县| 肃北| 新巴尔虎右旗| 璧山县| 凤阳县| 凌海市| 留坝县| 武强县| 临朐县| 广东省| 和硕县| 南投县| 驻马店市| 遂溪县| 嘉善县| 莫力| 察哈| 勐海县| 富平县| 克山县| 神农架林区| 尤溪县| 南宁市| 永仁县| 西和县| 兴国县| 思南县|