Python實現簡單圖像縮放與旋轉

1. 圖像縮放

1.2. 使用命令

import cv2
# 縮放
def resize(img, k, inter):
    res = cv2.resize(img, None, fx=k, fy=k, interpolation=inter)  
    return res

參數設定(interpolation):

0:最近鄰插值

1:雙線性插值

2:基於局部像素的重采樣

3:基於4*4像素鄰域的三次插值

4:基於8*8像素鄰域的Lanczos插值

img_row = cv2.imread(r'picture4.jpg')
cv2.imshow('origin_picture', img_row)
cv2.waitKey(0)
inters = [cv2.INTER_NEAREST, cv2.INTER_LINEAR, cv2.INTER_AREA, cv2.INTER_CUBIC, cv2.INTER_LANCZOS4]
for inter in inters:
    res1 = resize(img_row, 2, inter)
    cv2.imshow('res1', res1)
    cv2.waitKey(0)
    position = 'pic_resize' + '_' + str(inter) + '.jpg'
    cv2.imwrite(position, res1)

1.2. 原理介紹

幾種方法原理簡介:

最近鄰插值:將目標圖像中的點對應原圖像中最近鄰整數坐標點的像素值雙線性插值:f(x,y)為二元函數,假設我們知道f(x0,y0), f(x1,y1),f(x0,y1), f(x1,y0)四個點的值。這四個點確定一個矩形,我們希望通過插值得到矩形內任意點的函數值。於是我們在x方向上進行兩次線性插值,y方向上一次線性插值。綜合後得到以下公式:

 局部像素的重采樣:如果放大圖像的比例是整數倍,與最近鄰插值類似,如果放大的比例不是整數倍,則會采用線性插值三次插值:給定n+1個點,a=x0<x1 < . . . <xn=b,以及他們的函數值f (x i) , i = 0 , 1 , 2 , . . . n ,在每個區間 [ x i , x i + 1 ]上,確定一個三次多項式,每個三次多項式滿足共4n-2個條件,剩餘條件由邊界條件確定:

 Lanczos插值:

需要通過計算模板中的權重信息來計算x對應的值。對於一維信息,假如我們輸入的點集為X,那麼,Lanczos對應有個窗口模板Window,窗口中每個位置的權重計算如下,通常a取2或者3.根據計算出來的權重,然後再根據x即可求出對應的加權平均:

1.3. 方法比較

速度比較:

效果比較:

最近鄰插值:最簡單,但是邊緣沒有緩慢的過渡區域,導致放大圖像邊緣容易出現鋸齒雙線性插值:計算較最近鄰復雜,但是能很好避免邊緣鋸齒的現象區域重采樣:圖像放大時效果類似於雙線性插值三次插值法:計算較為復雜,但是具有良好的穩定性和平滑性Lanczos插值:計算最為復雜,效果最好,但是耗時最長1.4. 實驗結果

最近鄰:

 雙線性:

 基於局部像素的重采樣:

 三次插值法:

 Lanczos插值法:

2. 旋轉

2.1. 使用命令

import imutils
 
# 旋轉
def rotate(img, angle):
    res = imutils.rotate_bound(img, angle)
    return res
 
img_row = cv2.imread(r'picture4.jpg')
res2 = rotate(img_row, 45)
cv2.imshow('res2', res2)
cv2.waitKey(0)
cv2.imwrite(r'pic_rotate.jpg', res2)

2.2. 實驗效果

總結

到此這篇關於Python實現簡單圖像縮放與旋轉的文章就介紹到這瞭,更多相關Python圖像縮放與旋轉內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: