MATLAB圖像處理:把照片變成素描風格
效果對比:
原圖
處理後
本文與我的上一篇文章 MATLAB圖像處理:把照片變成動漫風格 有所不同,本文主要講解如何用MATLAB實現Photoshop的相應風格化處理過程。
1. Photoshop實現素描風格的過程
方法來源於知乎回答趙澈:怎麼將一張圖片做成素描樣式的圖片?
(1)原片載入為圖層1,去色
(2)圖層1調整曲線,輸出0,輸入70
(3)圖層1複製為圖層2,反相,顏色減淡
(4)圖層2使用最小值濾鏡,半徑1px
在我們的MATLAB實現中,對上述步驟略有改動,如下:
(1)原片載入為圖層1,去色
(2)圖層1調整曲線,輸出0,輸入40
(3)圖層1複製為圖層2,反相,並使用最小值濾鏡,半徑1px
(4)顏色減淡
2. MATLAB實現素描風格
(1)原片去色
Photoshop的去色也就是彩色圖像轉換為「灰色圖像」。之所以這裡說「灰色圖像」而不說灰度圖像,是因為PS中去色後得到的仍為三通道圖像;而灰度圖像往往是單通道圖像。換句話說,PS中RGB圖像經過去色後,仍然保持三通道,並且各通道都是相同的灰度圖像。
因此,我們在MATLAB中對原片使用rgb2gray(),將得到的灰度圖像賦給結果圖像的三個通道即可。
處理前(原圖):
處理後:
(2)圖層1調整曲線,輸出0,輸入40
關於PS的曲線工具,本文不做詳述,可參考What Are Curves in Photoshop? 。 如果要用MATLAB完整實現曲線工具,是相當複雜的。不過對於「輸出0,輸入40」這樣的特殊情況還是很容易實現的。
簡而言之,「輸出0,輸入40」所做的操作就是對各通道,將所有像素值小於等於40的像素點賦值為0(黑色),然後將40~255之間的像素值線性映射到0~255 —— 通過點 (40, 0) 和 (255, 255) 做一條直線進行映射,橫軸對應原圖上的像素值,縱軸對應映射後的像素值。
經過實際測試,MATLAB中使用了輸出0,輸入40,其效果比輸入70更好。
處理前:
處理後:
可以看到,顏色加深,因為小於40的點都變成純黑的了。
(3)圖層1複製為圖層2,反相,並使用最小值濾鏡,半徑1px
反相通俗的說就是把照片變成底片。實際上就是將各通道中的各像素點(假定像素值為Pi)賦值為 255-Pi。
顏色減淡是PS中的圖層混合模式之一。其具體的運算公式可參考How does photoshop blend two images together? ,其中的「ColorDodge」就是所謂的「顏色減淡」。圖層混合這一步在PS中順序無所謂,因為PS是實時混合、實時呈現效果,所以先設置顏色減淡和最後設置的效果是一樣的。而在MATLAB實現時,我們就要將顏色減淡在最後進行,這樣才能保證進行混合的是最終處理好的兩個圖層。因此在這裡暫不進行顏色減淡,而是在反相之後進行最小值濾鏡。
最小值濾鏡也就是圖像處理中常用的最小值濾波器 —— 取濾波器窗口內的最小值作為整個窗口範圍包含的所有點的像素值。
反相+最小值濾鏡處理前:
處理後:
(4)顏色減淡
將圖層 1 和 2 按照顏色減淡模式混合疊加。
處理前:
處理後:
3. 對比和總結
將我們的結果與原知乎回答對比,效果並不相同。主要是因為PS的一些功能並不能完全相同地用MATLAB實現:
(1)PS去色和MATLAB的rgb2gray計算公式不完全相同
(2)經過實測,我們的曲線調整和PS的曲線調整還是略有差別
等等。
推薦閱讀:
※素描怎麼做出皮膚質感?
※素描排線之間應該有縫隙還是要塗成色塊?
※美術藝考怎麼做到既能得到高分,又有藝術感的畫?
※零基礎入門素描里的排線技巧
※藝考類畫室和普通畫室的區別是什麼?