最近開始用一些濾鏡軟體去拍攝日常的照片或是風景,拍著拍著總覺得有些濾鏡就是差那麼一點就是我心目中最完美的感覺了。於是我就在想我應該也可以運用以前學過的影像處理和研究所被老師逼迫出來的奇怪技能樹來嘗試看看修圖!
當然,對影像處理熟悉的各位一定都知道,濾鏡就是一個 mask 覆蓋在原本的圖片上,但就是這樣的東西,可以被各種濾鏡 App 玩出花樣來,實在是太有趣了,這個系列會以不同的濾鏡為單位進行實作的嘗試!
想法
基本上,一張鉛筆素描的主要元素就是灰階的色系,所以!先把圖片轉乘灰階就對了!
1 | gray_img = cv2.cvtColor(rgb_img, cv2.COLOR_RGB2GRAY) |

素描的 mask 應該是有點深色的!所以接著把圖片反轉!
1 | reverse_gray = 255 - gray_img |

恩…素描應該都有點紙張糊糊的感覺吧!那我用卷積(convolution)來做高斯模糊好了!咦?這種東西 OpenCV 應該有吧?我看看…
居然還可以選擇捲積的大小,那我就設 (15,15) 吧。
1 | blurred_img = cv2.GaussianBlur(reverse_gray, (15,15), 0, 0) |

接下來要想辦法把模糊後的圖片當作 mask 蓋上去,這該怎麼弄呢?當然不能直接簡單的相加減囉!於是我決定用除法!
但一個一個像素除也太麻煩耗時了吧?!還要在那邊寫 for 迴圈…,還好有各位先輩的努力,OpenCV 有個 func() 叫做:divide
接著為了避免除法所得的值不再 (0,255) 的範圍,因此就用原始圖片除 mask 的倒數來組成圖片。
1 | pencil_sketch = cv2.divide(gray_img, 255 - blurred_img, scale=256) |

結語
今天的小嘗試蠻有趣的!中間有些地方參數的些微改動對最終的成品都有所影響!原來那些濾鏡 App 的參數調整就是調這些呀~
完整的程式碼如下:
1 | import cv2 |