# 前言 目前在電腦視覺中大多應用都是使用深度學習,但我認為對於一個研究電腦視覺領域的人來說,且現在許多科技廠仍會使用此技術進行檢測,所以傳統影像處理技還是非常重要的。 雖然在大學和碩士期間也會用影像處理技術對影像做處理,但也只是非常簡單的處理,如二值化、灰階、旋轉等。不過,除了這些,影像處理還有非常多的技術可以學,因此從這篇是我學好影像處理和打好基礎的第一篇。 這是我的學習紀錄,所有範例都是跟著[數位影像處理](https://www.books.com.tw/products/0010923809)這本書的教學及查詢網路上的資料,並使用我自己的方法整理,以及加上自己的看法。 ## 最近鄰內插值(Nearest Neighbor Interpolation)(4-3-1) **定義:** 從原始途中找到離映射點最近的座標值,並取其灰階或彩色值作為內插值 這個方法的好處簡單,異於實現。但由於是透過複製原始圖像中的像素點,所以相鄰的像素的像素點相同,導致容易出現色塊。 舉例說明,假設有一張3*3的圖(src),要將這張圖放大四倍,即3*3->4*4,該如何操作? ==原始圖像(src),如下圖所示:== ![src](https://hackmd.io/_uploads/ryeDhD-eT.png) - 計算x,y縮放的比例 src_x = dst_x * (src_width / dst_width) src_y = dst_y * (src_height / dst_height) - 假設要求目標影像中(0, 3)的像素值 (0*(3/4), 3*(3/4)) -> (0*0.75, 3*0.75) 但由於座標為「整數」,所以將其四捨五入找最接近的值(0, 2) - 也就是目標圖(0, 3)的像素值等於原始圖(0, 2)的像素值 ==所以計算完後,目標圖如下圖所示:== ![dst](https://hackmd.io/_uploads/B1yLRDbxp.png) 從上圖的結果可以看出,有許多位置的像素值都是相同的,所以透過這種直接複製像素值的方法,會出現多處鄰近位置的像素值是一樣的,也就是會有色快的產生。 ## 雙線性插值(Bilinear interpolation)(4-3-2) 根據上述的說明,當3x3的影像F(x, y)放大為4x4的影像Q(x, y)時,Q(1, 2)對應到F(x=1(3/4), y=2(3/4)) = F(0.75, 1.5),最近鄰插值會直接取F(1, 2)的值代入F(0.75, 1.5),==如下圖所示:== ![](https://hackmd.io/_uploads/BJ0MxuZlp.png) 但是這個方法並不聰明,因為F(0.75, 1.5)周圍有4個像素(DEGH),考量這4個像素加權的影響一定會比單考慮最接近的1個像素來得合理。 **定義:** 雙線性插值就是**考慮四個鄰近點的像素值**來計算出目標位置的像素。計算方法可以透過線性插值(Linear Interpolation)方式推算出兩點之間的任一點的值,實際可分成以下步驟: - 先從原始影像中找到離目標最近的值 - 計算四個鄰近點座標 - 雙線性插值 - 先對兩個x方向進行插值 - 再對y方向進行插值 --- 假設F(x,y)周圍有四個像素分別為F(x0,y0)、F(x1,y0)、F(x0,y1)、F(x1,y1),==如下圖所示:== ![4pixels](https://hackmd.io/_uploads/B1O-EO-ga.png) - 先對兩個x方向進行現行插值,得到F(x,y0)和F(x,y1) ![x方向插值](https://hackmd.io/_uploads/Hk8Hw_-g6.jpg) - 再透過F(x,y0)和F(x,y1)對y方向進行線性插值,得到F(x,y) ![y方向插值](https://hackmd.io/_uploads/HJ1yd_Zl6.jpg) 所以雙線性插值其實是透過三次的線性插值所構成的算法。 [Source Code Please Visit](https://github.com/ChrisCodeNation/Digital-Image-Processing-with-Python/blob/main/4-3%20影像插值.ipynb) ## 影像插值結果比較 ==原始影像,如下圖所示:== ![lenna](https://hackmd.io/_uploads/Bk_Drd-g6.png =50%x) <br> ==Nearest Neighbor vs Billinear Interpolation(放大到(600,600)):== ![vs](https://hackmd.io/_uploads/BktjrdWxa.png) <br> ==局部放大,如下圖所示:== ![局部](https://hackmd.io/_uploads/ry1-Iu-xp.png)