# -*- coding: utf-8 -*-
'''
今天來看看opencv中的resize方法。
就打個tag: opencv resize
先看看官方定義
void cv::resize ( InputArray src,
OutputArray dst,
Size dsize,
double fx = 0,
double fy = 0,
int interpolation = INTER_LINEAR
)
Python:
dst = cv.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]] )
各個參數可以參考c++版本的數據類型。簡單解釋如下:
參數 類型 是否必須指定 具體含義
src numpy.ndarray 是 原圖像
dsize tuple<int> 是 縮放後的圖像大小
dst 無所謂 否 目標圖像,但是在 Python 裏面沒有任何意義。一般不傳參或者設成 None
fx, fy 數值類型 否 x 和 y 方向上的縮放比例
interpolation int 否 插值方式表示代碼,本質是一個 int 數值,一般用 OpenCV 內置的參數代號以提高可讀性。
具體可以參考官方的這個解釋:
enum cv::InterpolationFlags {
cv::INTER_NEAREST = 0,
cv::INTER_LINEAR = 1,
cv::INTER_CUBIC = 2,
cv::INTER_AREA = 3,
cv::INTER_LANCZOS4 = 4,
cv::INTER_LINEAR_EXACT = 5,
cv::INTER_NEAREST_EXACT = 6,
cv::INTER_MAX = 7,
cv::WARP_FILL_OUTLIERS = 8,
cv::WARP_INVERSE_MAP = 16
}
因此在使用時,可以寫代號也可以寫出來方法名字。
使用方法從參數來看,可以設置resize後圖像的大小,也可以通過設置方法比例進行resize。
從參數列別可以看到,參數src, dsize是必須有的參數,後面的參數都是可選,或者是有默認值的參數。因此,就是你指定了fx,fy,也必須
同時給dsize賦值(可以為None),否則會報錯。但是當你指定dsize的大小了,可以不用管fx,fy.
此處要特別注意,從參數順序就能看到,此處顯示x方向再是y方向的,也就是說先是寬度,再是高度。
此處主要還是要看官方的一個地方是參數的設置,
To shrink an image, it will generally look best with INTER_AREA interpolation, whereas to enlarge an image,
it will generally look best with c::INTER_CUBIC (slow) or INTER_LINEAR (faster but still looks OK).
這裡的意思是,如果resize後,圖像變小了,推薦插值算法用INTER_AREA,而如果resize後,圖像大小變大了,推薦用INTER_LINEAR或者慢點
但是效果更好的方式INTER_CUBIC (slow)。因此,如果你確定大多數圖像resize前後都是增大還是減小,那就可以相應選擇對應的插值方法。
'''
'''
first, let me see the img shape. When you using img.shape, it is height, width, channel. Remember this.
'''
import numpy as np
import cv2
img = cv2.imread(r"messi.jpg")
print('origin image',img.shape) # (296, 474, 3) in height, width, channel
cv2.imshow("messi", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
rimg = cv2.resize(img,dsize=None,fx=2,fy=2,interpolation=cv2.INTER_LINEAR)# 放大了兩倍,此處dsize不可以省略,必須指定的參數
cv2.imshow("resize messi", rimg)
cv2.waitKey(0)
cv2.destroyAllWindows()
rwidth = img.shape[1]*2
rheight = img.shape[0]*2
# 放大了兩倍,此處dsize必須是先width再height.
rimg2 = cv2.resize(img,dsize=(rwidth, rheight),interpolation=cv2.INTER_LINEAR)
cv2.imshow("resize messi2", rimg2)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 當dsize和fx,fy不一致,而且兩者又都是有效的,優先選擇dsize作為參數,而忽略fx,fy。
rwidth = img.shape[1]*3
rheight = img.shape[0]*3
rimg3 = cv2.resize(img,dsize=(rwidth, rheight),fx=1,fy=1,interpolation=cv2.INTER_LINEAR)
cv2.imshow("resize messi3", rimg2)
print ('resize image: ',rimg3.shape) # (888, 1422, 3)
cv2.waitKey(0)
cv2.destroyAllWindows()