1. 程式人生 > >影象處理: 五種 插值法

影象處理: 五種 插值法

Syntax

cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]]) → dst

interpolation 選項 所用的插值方法
INTER_NEAREST 最近鄰插值
INTER_LINEAR 雙線性插值(預設設定)
INTER_AREA 使用畫素區域關係進行重取樣。 它可能是影象抽取的首選方法,因為它會產生無雲紋理的結果。 但是當影象縮放時,它類似於INTER_NEAREST方法。
INTER_CUBIC 4x4畫素鄰域的雙三次插值
INTER_LANCZOS4 8x8畫素鄰域的Lanczos插值

INTER_NEAREST | 最近鄰插值

在一維空間中,最近點插值就相當於四捨五入取整。在二維影象中,畫素點的座標都是整數,該方法就是選取離目標點最近的點。

會在一定程度上損失 空間對稱性(Alignment),在 RoI Pooling 中使用。

這裡寫圖片描述

INTER_LINEAR | 雙線性插值(預設設定)

在兩個方向分別進行一次線性插值。

這裡寫圖片描述

在影象處理的時候,我們先根據

srcX = dstX* (srcWidth/dstWidth)
srcY = dstY * (srcHeight/dstHeight)

來計算目標畫素在源影象中的位置,這裡計算的srcX和srcY一般都是浮點數,比如 f(1.2, 3.4)

這個畫素點是虛擬存在的,先找到與它臨近的四個實際存在的畫素點

(1,3) (2,3)
(1,4) (2,4)

寫成 f(i+u,j+v) 的形式,則 u=0.2,v=0.4, i=1, j=3

f(i+u,j+v) = (1-u)(1-v)f(i,j) + (1-u)vf(i,j+1) + u(1-v)f(i+1,j) + uvf(i+1,j+1) 

保證了 空間對稱性(Alignment),在 RoI Align 中使用。

這裡寫圖片描述

INTER_AREA | 使用畫素區域關係進行重取樣。

略。

INTER_CUBIC | 4x4畫素鄰域的雙三次插值

略。

INTER_LANCZOS4 | 8x8畫素鄰域的Lanczos插值

在x,y方向分別對相鄰的八個點進行插值,也就是計算加權和,所以它是一個8x8的描述子。

Code

# coding=utf-8

import cv2
"""
INTER_NEAREST | 最近鄰插值
INTER_LINEAR | 雙線性插值(預設設定)
INTER_AREA |  使用畫素區域關係進行重取樣
INTER_CUBIC  | 4x4畫素鄰域的雙三次插值
INTER_LANCZOS4 |  8x8畫素鄰域的Lanczos插值
"""

if __name__ == '__main__':
    img = cv2.imread("girl.jpg")
    height, width = img.shape[:2]

    # 縮小影象
    size = (int(width*0.8), int(height*0.7))
    shrink_NEAREST = cv2.resize(img, size, interpolation=cv2.INTER_NEAREST)
    shrink_LINEAR = cv2.resize(img, size, interpolation=cv2.INTER_LINEAR)
    shrink_AREA = cv2.resize(img, size, interpolation=cv2.INTER_AREA)
    shrink_CUBIC = cv2.resize(img, size, interpolation=cv2.INTER_CUBIC)
    shrink_LANCZOS4 = cv2.resize(img, size, interpolation=cv2.INTER_LANCZOS4)

    # 放大影象
    fx = 1.2
    fy = 1.1
    enlarge_NEAREST = cv2.resize(img, (0, 0), fx=fx, fy=fy, interpolation=cv2.INTER_NEAREST)
    enlarge_LINEAR = cv2.resize(img, (0, 0), fx=fx, fy=fy, interpolation=cv2.INTER_LINEAR)
    enlarge_AREA = cv2.resize(img, (0, 0), fx=fx, fy=fy, interpolation=cv2.INTER_AREA)
    enlarge_CUBIC = cv2.resize(img, (0, 0), fx=fx, fy=fy, interpolation=cv2.INTER_CUBIC)
    enlarge_LANCZOS4 = cv2.resize(img, (0, 0), fx=fx, fy=fy, interpolation=cv2.INTER_LANCZOS4)

    # 儲存影象
    cv2.imwrite("shrink_NEAREST.jpg", shrink_NEAREST)
    cv2.imwrite("shrink_LINEAR.jpg", shrink_LINEAR)
    cv2.imwrite("shrink_AREA.jpg", shrink_AREA)
    cv2.imwrite("shrink_CUBIC.jpg", shrink_CUBIC)
    cv2.imwrite("shrink_LANCZOS4.jpg", shrink_LANCZOS4)

    cv2.imwrite("enlarge_NEAREST.jpg", enlarge_NEAREST)
    cv2.imwrite("enlarge_LINEAR.jpg", enlarge_LINEAR)
    cv2.imwrite("enlarge_AREA.jpg", enlarge_AREA)
    cv2.imwrite("enlarge_CUBIC.jpg", enlarge_CUBIC)
    cv2.imwrite("enlarge_LANCZOS4.jpg", enlarge_LANCZOS4)

Demo

原影象:
這裡寫圖片描述

利用插值縮小

最近鄰插值
這裡寫圖片描述

雙線性插值(預設設定)
這裡寫圖片描述

使用畫素區域關係進行重取樣
這裡寫圖片描述

4x4畫素鄰域的雙三次插值
這裡寫圖片描述

8x8畫素鄰域的Lanczos插值
這裡寫圖片描述

利用插值放大

最近鄰插值
這裡寫圖片描述

雙線性插值(預設設定)
這裡寫圖片描述

使用畫素區域關係進行重取樣
這裡寫圖片描述

4x4畫素鄰域的雙三次插值
這裡寫圖片描述

8x8畫素鄰域的Lanczos插值
這裡寫圖片描述