一、影像銳化 Sharpening
對一張數位影像做銳化其實是一種很常見的動作/需求,特別是在一些修圖軟體中,可能我們想要增強原始影像中的某一些細節(detail),這時後要做的就是銳化![註一]
我們前面所指的那些細節(detail),通常會存在於影像的邊緣(edge)。 而邊緣通常具有以下幾點特性:
你會發現影像裡面的那些細節(邊緣)的地方是會在所謂的高頻區,而低頻區就是影像的平坦區(如果你從Spatial domain 來看,就是周邊臨點數值都差不多的地方。) 那麼接下來你可能會覺得,既然這樣那不是很直覺的做一個High-pass filter ( 高通濾波器 ),把低頻的成分濾掉用高頻的那些細節回頭去Enhance 原圖這樣工作不就做完了嗎? 嗯.. 理論上是這樣沒錯,但在現實生活中事情總沒這麼美好Q_Q 因為只要你的影像是一張自然影像[註二],就一定有雜訊! 只是你不是在絕對零度 K 的地方進行取像,有熱的地方就一定會有雜訊。 而那些雜訊在Frequency domain 分佈也是落在高頻區,所以如果你真的只是單純的用高頻的成份去Enhance 原圖的話,那麼連雜訊也都被你放大了!而雜訊被放大這件事,在人眼視覺中是相當糟糕的。 為了要避免這個問題,並做到影像銳化的效果,所以就會採用這次要講的Unsharp Masking。 其實它的概念也很簡單,就是 透過設計一個Mask 把它罩在影像的邊緣上 ,然後針對邊緣的部分做sharpening 的動作,其餘的不是邊緣的地方我們就把它給略過,進而避免把平坦區的雜訊放大。 二、邊緣偵測 Find Edge
Ok 在有了前面的基本觀念之後,那我們接下來要做的就是找到影像的邊緣。
其實看完前面寫的,我想你大概也有一個概念就是,找影像邊緣這件事是可以在Frequency domain中輕鬆做到的!但是做Fourier transform 這件事本身卻非常麻煩,如果是工科背景出身以前學過傅立葉的大概就知道我再講什麼。即便你今天是可以把這些麻煩的工作全部都丟給電腦來做,但是這樣的話你寫出來程式的Performance 可能就不會太好,這也不會是一個好的演算法設計。 那我能不能直接在Spatial domain就把這件事情給做掉呢? ( 以省去對Image 做Fourier transform 與 Inverse Fourier transform 的計算資源與時間 ) 答案是可以的! 偉哉的數學家們告訴我們可以設計一個遮罩(mask) 配合捲積(convolution)運算,就可以在Spatial domain 中得到跟在Frequency domain 上一樣的結果。 至於這個遮罩要怎麼去設計,那就有一點學問了! 我們今天先不用討論這個,就先拿別人研究/設計好的遮罩來用吧。 2-1 Sobel Operator
這東西中文應該翻作「索伯運算子」,是在影像裡面很常用到的運算子,基本上現在做Edge Detection 的大部分都是直接用 Sobel 或者 Canny edge。
這個運算子用到的 mask 有兩個,分別是 dy 跟 dx 的部分:
所以只要把原圖套進 dy 的 mask 算一次,可以得到Gy;把原圖套進 dx 的 mask 算一次,得到Gx。
這樣你就得到 2個不同dimension 的微分結果了( 雖然認真講的話這是差分啦xD ), 在來算它們的距離就好了,一般在數學上是用歐氏距離 [註三]:
但是又要平方,又要開根號的,太麻煩了~
能不能簡單一點? 答案是可以的! 一般在實作上我們會改用 L1距離,即曼哈頓距離: 講了那麼多,我們還是直接來看一下實作出來效果長的怎樣吧! Source Image -> Sobel Operator -> 一階微分結果 2-2 Laplace Operator
Ok 這個東西呢,對有學過工程數學的同學都不太陌生的吧~
是的,就是我們的「拉普拉斯運算子」啦~ 至於沒學過的就.. 大概有個概念它是個很屌的算子,在天體力學、熱力學、流體力學、電磁學、量子力學... 幾乎都會看到它的身影,大概只要有用到微積分的地方就很容易會用到laplacian這樣的數學工具。 而在影像處理/電腦視覺這個domain,laplacian 就常被用在 斑點偵測跟邊緣偵測上。 至於我們今天要應用的Laplace Mask 長這樣:
跟 Sobel 不一樣的是,Laplace 做一次就做完了,不需要像 Sobel 那要dy 做一次 dx 做一次再加起來。而我上面列出來的兩個mask 其實都是 laplace 的 mask,只差在左邊的是基礎版的,右邊的是加強版。
那有沒有比右邊更強化的版本? 其實也是有的,只是 Jason 認為應該是沒有必要再列出來這樣。 實作的時候你從兩個裡面,挑一個來用就可以了。 Source Image -> Laplace Operator -> 二階微分結果 三、非銳化濾波 Unsharp Masking
如果你Google "unsharp masking",搜尋結果跳出來在維基百科裡面,你應該會看到下面這個數學公式:
我相信很多人在看完上面的公式可能也不太懂到底要幹嘛吧~
所以 Jason 稍微幫大家整理了一個流程步驟出來,見下圖:
基本上就是有一張原始影像(Source Image)進來,我們想對它做 Unsharp Mashing,步驟如下:
步驟(5) 利用〈Result 4〉做為mask 把〈Result 3〉非影像邊緣的數值(即被放大過後的雜訊)給濾掉。 步驟(6) 利用〈Result 5〉對原圖做Enhancement 即完成了所謂的Unsharp masking。 實驗的結果就長的像本篇封面圖片那樣,就不在重複貼了。 好吧!這篇就寫到這樣吧~ 感謝各位收看 【程式碼下載】
[註一] 與銳化相反的動作就叫作鈍化;銳化是增強影像中的細節,而鈍化就是會把影像中的細節給模糊掉。
[註二] 利用取像設備(由感光元件組成),在真實自然場景中所擷取(拍攝)到的影像;非人工用軟體做出來的。 [註三] 所謂的歐氏距離,就是大神歐基里德發明的那個,即你在國中的時候學的距離公式。也稱L2距離
8 評論
balmydrizzle
9/20/2019 11:56:47
mask應該是遮罩,怎會翻作濾鏡?濾鏡應該是filter吧?
回覆
Jason Chen
9/20/2019 13:49:33
Hi balmydrizzle,
回覆
Mark
11/14/2019 16:43:01
Hi Jason
回覆
Jason Chen
11/16/2019 01:36:14
Hi Mark,
回覆
周玄
2/26/2020 22:49:12
您好:我想請問Unsharp Mashing的步驟5:將〈Result 3〉與〈Result 4〉做相乘的動作,得到我們真正要 Enhance 的數值〈Result 5〉。
回覆
Jason Chen
2/27/2020 12:41:43
是的,我記得我當初是這麼做沒有錯,另外我應該有附上一段之前用 C++ 配合 OpenCV 實作的代碼在上面,你可以參考看看。
回覆
Kins
5/15/2020 11:53:31
您好,最近作業剛好要做Unsharp Masking。
回覆
Jason Chen
5/16/2020 03:31:56
Hi Kins,
回覆
發表回覆。 |
Jason Chen人不光是生來就擁有一切,而是靠他從學習中得到的一切來造就自己。- 歌德 文章分類
全部
封存檔
九月 2023
|