天天看點

圖像插值算法

最近鄰插值

通過一種計算方法,比對原來圖像的位置資訊,以最近位置的資料進行填充。

缺點:有時候圖像會失真,用該方法作放大處理時,在圖象中可能出現明顯的塊狀效應。

雙線性插值

公式

y = y 0 + ( x − x 0 ) y 1 − y 0 x 1 − x 0 = y 0 + ( x − x 0 ) y 1 − ( x − x 0 ) y 0 x 1 − x 0 y=y_{0}+\left(x-x_{0}\right) \frac{y_{1}-y_{0}}{x_{1}-x_{0}}=y_{0}+\frac{\left(x-x_{0}\right) y_{1}-\left(x-x_{0}\right) y_{0}}{x_{1}-x_{0}} y=y0​+(x−x0​)x1​−x0​y1​−y0​​=y0​+x1​−x0​(x−x0​)y1​−(x−x0​)y0​​

通過計算相應位置上的均值進行填充

映射

  可以将幾何運算想象成一次一個象素地轉移到輸出圖象中。如果一個輸入象素被映射到四個輸出象素之間的位置,則其灰階值就按插值算法在4個輸出象素之間進行配置設定。

優點:旋轉、拉伸、放縮可以使用,解決了漏點的問題。

缺點:出現了馬賽克。

練習代碼

import cv2
if __name__ == "__main__":
    img=cv2.imread('D://2233.jpg',cv2.IMREAD_UNCHANGED)
    print('Original Dimensions:',img.shape)
    
    Scale_persent=30
    width=int(img.shape[1]*Scale_persent/100)
    height=int(img.shape[0]*Scale_persent/100)
    dim=(width,height)

    resized=cv2.resize(img,dim,interpolation=cv2.INTER_LINEAR)

    fx=1.5
    fy=1.5

    resized1=cv2.resize(resized,dsize=None,fx=fx,fy=fy,interpolation=cv2.INTER_NEAREST)
    resized2=cv2.resize(resized,dsize=None,fx=fx,fy=fy,interpolation=cv2.INTER_LINEAR)

    print(resized.shape)
    cv2.imshow("Resized image", resized)
    cv2.imshow("INTER_NEAREST image", resized1)
    cv2.imshow("INTER_LINEAR image", resized2)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
           

出現的問題及解決方式

問題:

line 4, in <module>
	    print('Original Dimensions:',img.shape)
	AttributeError: 'NoneType' object has no attribute 'shape'
           

解決方式:最開始時使用了中文目錄,進而使圖檔無法導入,進而出現問題。

繼續閱讀