tft每日頭條

 > 生活

 > python人臉素描圖

python人臉素描圖

生活 更新时间:2024-12-26 19:48:59
圖像轉素描效果展示

python人臉素描圖(任意圖像轉素描)1

看到這個标題你可能覺得,我這次終于開始标題黨了。然而衆所周知,我是标圖~,一般不會做标題黨這種事情,既然說了分分鐘實現,那就說明——代碼在十行左右

代碼雖少,但是效果确實一點都不含糊(即使含糊了....我也給出了調參的空間~)。

按照慣例,先看兩張效果圖:

python人臉素描圖(任意圖像轉素描)2

還有一張在最上方。

我感覺我肯定是膨脹了,示例圖片都敢不全放美女圖片了。不全用美女示例圖片的另一個原因是,之前做的AI小素隻能做臉部的素描,其他部分的素描做的一塌糊塗(訓練集隻有臉部圖片),這次換個天壇這種建築圖片,也能說明這個CV小素的能力要超過AI小素,能對不僅限于人臉人物的任意類型的圖片做素描化。說任意類型可能有點誇大,不上線之前确實測試了不少類型的圖片,效果都還可以。更多類型的圖片效果,期待大家來測試,歡迎拍磚~

圖像轉素描原理與實現

做這個圖像轉素描的初衷是因為之前訓練了一個肖像轉素描的AI模型,還非常中二地命名為【AI小素】,不少小夥伴應該已經在網站上體驗過AI小素的素描化效果了。但是AI小素限制太強,隻能素描化人臉圖片,其他圖片則無能為力。因此,我就看了下怎麼做任意圖片的素描化。

大家一般用PS做圖像轉素描,谷歌搜索結果排第一的教程流程大概是這樣的:

python人臉素描圖(任意圖像轉素描)3

這個教程一共有十六個步驟,但是其實上圖展示的這些已經足以說明圖像轉素描的主要流程了。

圖像轉素描流程如下:

  1. 圖像去色(上圖教程中通過調小飽和度)
  2. 圖像取反
  3. 取反後的圖像進行高斯濾波
  4. 去色後的圖像和取反濾波後的圖像以混合模式為顔色減淡進行融合

看到這裡,了解PS的小夥伴們可能已經知道怎麼用PS做素描圖了。

下面我們看看如何用Python實現,仍然用我們最熟悉的OpenCV。

1. 備圖

首先最基礎的,準備一張小姐姐的圖片,并讀取出來備用:

importcv2 img_path="/小/姐/姐/美/圖.jpg" img=cv2.imread(img_path)

python人臉素描圖(任意圖像轉素描)4

2. 去色

說到去色,你可能立刻就想到了灰度化,是的,那就用灰度化吧。代碼簡單到無需注釋和解釋,還是直接上碼上效果圖吧:

gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

python人臉素描圖(任意圖像轉素描)5

3. 圖像取反

圖像取反,乍一聽好像很陌生,看完下面這一行更簡單的代碼你就明白了:

inv=255-gray

過于簡單了?看效果吧。

python人臉素描圖(任意圖像轉素描)6

狀若女鬼,好像要向着恐怖片的方面發展......實際上隻是圖片中黑白易色,上圖中的衣服體現的最為直觀。

4. 高斯濾波

最基礎的濾波,不多說。

blur=cv2.GaussianBlur(inv,ksize=(ksize,ksize),sigmaX=sigma,sigmaY=sigma)

ksize和sigma兩個參數可根據實際情況調節,我這裡調參的覺得ksize=15, sigma=50效果還可以。你也可以調節下這兩個參數,看看不同參數對最終素描化效果的影響。

python人臉素描圖(任意圖像轉素描)7

狀若加了高斯濾鏡的女鬼......

5. 顔色減淡混合

實際的混合模式的顔色減淡實現起來比較麻煩,而且速度較慢。有人說下面這一行代碼就可以實現顔色減淡的效果,我是極為佩服的:

res=cv2.divide(gray,255-blur,scale=255)

python人臉素描圖(任意圖像轉素描)8

梳理一下

梳理一下上面的流程,相當于是,對于灰度圖像中的每一個像素值x,用255 - x取反之後得到inv_x,再對此點進行高斯濾波得到blur_inv_x,然後用執行一下運算進行混合:

x/(255-blur_inv_x)*255

從上圖可以看到,已經得到了效果不錯的素描化圖片了。對于有的圖片可能素描化之後顯得顔色有點淡,沒關系,加個伽馬變換調節一下就行了。

問題來了

上面是根據PS的流程轉化的Python實現流程,感覺實際上起作用的就是這個公式x / (255 - blur_inv_x) * 255。

上面的流程是:

灰度圖->取反->高斯濾波->再取反(除法裡面)->除法運算(divide)。

我們看到,裡面有兩次取反操作,中間隻是多了一個高斯濾波而已。衆所周知,負負得正,取反兩次相當于沒有取反(我真是邏輯鬼才!)

那麼問題來了,不取反行不行?行不行?試一下就知道了!

實驗流程是下面這樣的:

灰度圖->高斯濾波->除法運算(divide)。

公式是:x / blur_x * 255。

最終的結果是下面這樣的:

python人臉素描圖(任意圖像轉素描)9

與取反的差别在哪裡呢?仔細看的話,取反的背景會更清晰一些,前景倒沒有太大差别。

開始玩

上面已經介紹了素描化的完整實現,接下來就要開始各種玩了。我實現了幾種基本的玩法,你看看有多基本:

  • 支持動态圖
  • 素全圖
  • 素左邊
  • 素右邊
  • 素上邊
  • 素下邊

python人臉素描圖(任意圖像轉素描)10

python人臉素描圖(任意圖像轉素描)11

參數可調,效果不好的話,可能需要你親自動手調節一下:

python人臉素描圖(任意圖像轉素描)12

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved