女神說拍了一套寫真集想弄成素描畫?很簡單,用Python就好了!

素描做爲一種近乎完美的表現手法有其獨特的魅力,隨着數字技術的發展,素描早已再也不是專業繪畫師的專利,今天這篇文章就來說一講如何使用python批量獲取小姐姐素描畫像。文章共分兩部分:css

  • 第一部分介紹兩種使用python生成素描畫的思路html

  • 第二部分介紹如何批量獲取素描畫python

1、獲取素描圖的兩個思路

本部分介紹的兩個思路都是基於opencv來實現,不涉及深度學習相關內容。基本思想是讀入一張照片圖,而後經過各類變換轉化成素描圖。爲了演示方便,咱們先找來一張小姐姐的照片做爲實驗素材。程序員

一、漫畫風格正則表達式

先來講第一種方法,這種方法的核心思想是利用了名爲「閾值化」的技術,這種技術是基於圖像中物體與背景之間的灰度差別,而進行的像素級別的分割。算法

若是想要把一張圖片轉化爲只呈現黑色和白色的素描圖,就須要對其進行二值化操做,opencv中提供了兩種二值化操做方法:threshold()和adaptiveThreshold()。相比threshold(),adaptiveThreshold()可以根據圖像不一樣區域亮度分佈進行局部自動調節,所以被稱爲自適應二值化。下面這幅圖就是對彩色圖片進行二值化操做後的效果。ide

上面提到的概念可能比較晦澀,不理解也沒有關係,下面咱們重點講講怎麼進行實際操做。函數

第一步,讀入圖片並轉化爲灰度圖。這一步算是常規操做了,相信使用過opencv的同窗都寫過相似的代碼。學習

img_rgb = cv2.imread(src_image)
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_RGB2GRAY)

第二步,使用adaptiveThreshold()方法對圖片進行二值化操做,函數中的參數大多用於設置自適應二值化的算法和閾值等。網站

img_edge = cv2.adaptiveThreshold(img_gray, 255,
                                 cv2.ADAPTIVE_THRESH_MEAN_C,
                                 cv2.THRESH_BINARY, blockSize=3, C=2)

第三步,保存轉換後的圖片

cv2.imwrite(dst_image, img_edge) 

通過上述步驟的操做,咱們獲得了一幅新的黑白圖片,一塊兒來看看轉換後的圖片效果。

從轉換後的圖片來看,雖然大概輪廓沒有問題,可是效果很不理想,並不可以稱之爲素描圖。這主要是由於adaptiveThreshold()會在圖片的每個小的局部區域內進行二值化操做,所以對於一些清晰度比較高、色彩區分比較細膩的圖片,就會出現上面這樣密密麻麻的狀況。

這個問題解決起來其實也很簡單,只要在進行二值化以前加入下面這行代碼對原圖進行模糊化就能夠了。

img_gray = cv2.medianBlur(img_gray, 5)

再來看看此次生成的素描圖(下圖),是否是看起來舒服多了,還有一種手繪漫畫的感受。

二、寫實風格

經過上面這種方法,雖然最終也得到了一幅還算不錯的素描圖,可是看起來多少有些「失真」,爲了獲取看起來更加真實的素描圖,咱們嘗試另一種方法。

這種方法的核心思想是經過「底片融合」的方式獲取原圖中一些比較重要的線條,具體實現步驟以下:

第一步,跟上面的方法同樣,使用opencv讀取圖片並生成灰度圖。

第二步,對灰度圖進行模糊化操做。通過試驗,使用上面提到的中值濾波函數cv2.medianBlur()進行模糊化操做最終獲得的素描圖效果並很差,這裏咱們嘗試使用高斯濾波進行圖片模糊化,代碼以下:

img_blur = cv2.GaussianBlur(img_gray, ksize=(21, 21),
                            sigmaX=0, sigmaY=0)

其中,參數ksize表示高斯核的大小,sigmaX和sigmaY分別表示高斯核在 X 和 Y 方向上的標準差。

第三步,使用cv2.divide()方法對原圖和模糊圖像進行融合,cv2.divide()本質上進行的是兩幅圖像素級別的除法操做,其獲得的結果能夠簡單理解爲兩幅圖之間有明顯差別的部分。來看代碼:

cv2.divide(img_gray, img_blur, scale=255)

第四步,保存生成的圖片,代碼跟上一個方法中同樣,咱們直接來看獲取到的素描圖效果。

從結果來看,這種方法得到的素描圖線條更加細膩,素描效果也更好。

2、批量獲取小姐姐素描畫像

在這一部分,咱們要實現批量獲取小姐姐素描畫像的功能,基於上文中兩種素描圖效果比對,這裏採用第二種方法來實現圖片到素描圖的轉換。

那麼,接下來要解決的就是圖片源的問題了。最近不少項目都成功實現了從抖音或者知乎獲取漂亮小姐姐這一操做,其實除了這些平臺以外還有好多網站能獲取到漂亮小姐姐的圖片。

網站的具體內容我就不在文中展現了,爲了指定圖片爬取的思路,大概講下頁面結構:網站的主頁羅列了N個主題,每一個主題頁面中都包含了M張小姐姐的圖片,結構示意圖以下:

各頁面url的構建也很明瞭,例以下圖中的頁面url是http://www.waxjj.cn/2794.html,其中2794就是主題頁的ID號。查看頁面的html代碼(下圖),發現每張圖片都在一個<li>標籤下面。

遇到這種狀況,通常來講咱們能夠經過某種解析器來獲取每張圖片的url。可是,通過仔細觀察發現整個網頁的html代碼中只有涉及圖片url的部分帶有完整的http鏈接,所以能夠考慮使用正則表達式來提取圖片url,實現這部分功能的代碼以下。

在上面這段代碼中,咱們提取主題頁的ID做爲待保存圖片名稱的一部分,save_jpg()函數中會把每張圖片轉換爲素描圖並保存到本地。

因爲咱們要使用opencv對抓取到的圖片進行各類運算轉換,所以使用requests獲取的圖片必須先保存到本地,再用opencv從新讀入後才行。基於上述思想,咱們構建了以下所示的save_jpg()函數,其中rgb_to_sketch()函數是對上文第一部分中所說的第二種素描圖的獲取方法進行的封裝。

而在主函數中,咱們只須要指定想要獲取主題頁面的id號,構建一組url列表就能夠了:

def main(): idlist = ['id1', 'id2'] urllist = ['http://www.waxjj.cn/'+x+'.html' for x in idlist] jpgurls = get_jpg_urls(urllist) 

以上就是完整代碼,在學習Python的過程當中,每每由於沒有資料或者沒人指導從而致使本身不想學下去了,所以我特地準備了個羣 592539176 ,羣裏有大量的PDF書籍、教程都給你們無償使用!不論是學習到哪一個階段的小夥伴均可以獲取到本身相對應的資料!來看看運行後的效果吧~~

其實程序員要想防止脫髮,我以爲仍是要多鍛鍊身體,少熬夜,固然多看看養眼的小姐姐也不是不錯的!

你說呢

相關文章
相關標籤/搜索