###### tags: `OpenCV`,`影像處理`,`幾何變換` # OpenCV 基礎篇-圖像縮放、圖像旋轉 **圖像縮放** * 主要用於改變圖像的大小 * 縮放後圖像的寬度和高度會發生變換 * 水平縮放係數,控製圖像寬度的縮放,其值為1,則圖像的寬度不變 * 垂直縮放係數,控製圖像高度的縮放,其值為1,則圖像高度不變 * 如果水平縮放和垂直縮放係數不相等,那麼縮放後圖像的寬度和高度的比例會發生變換,會使圖像變形。 * 要保持圖像寬度和高度的比例不發生變換,就需要水平縮放係數和垂直縮放係數相等。 **cv2.resize 參數說明** resize(src, dsize, dst=None, fx=None, fy=None, interpolation=None) src:待處理的輸入圖像 dsize:輸出圖像的大小 fx:width方向的縮放比例 fy:height方向的縮放比例 interpolation:這個是指定插值的方式 * INTER_NEAREST - 最近鄰插值(放大的圖像容易出現鋸齒的現象) * INTER_LINEAR - 雙線性插值(預設值使用方法,圖像放大速度較佳) * INTER_AREA - 區域插值方法(圖像縮小建議使用,可降低出現波紋現象) * INTER_CUBIC - 4x4像素鄰域內的雙立方插值(可以有效避免出現鋸齒的現象,圖像放大效果佳) * INTER_LANCZOS4 - 8x8像素鄰域內的Lanczos插值 ![](https://i.imgur.com/LcYGU68.png) ![](https://i.imgur.com/ZCIU3BS.png) **matplotlib連結** <https://matplotlib.org/stable/tutorials/introductory/customizing.html> ```python= #resize 1.2倍width,0.7倍height import numpy as np import matplotlib.pyplot as plt img = cv2.imread('newnew.jpg') #圖片是我家女兒,吃冰開心到翻掉的樣子 img_new = cv2.resize(img, (0,0), fx=1.2, fy=0.7)#1.2倍width,0.7倍height #matplotlib.rcParams['figure.figsize']#圖片像素 plt.rcParams['figure.figsize'] = [100, 200] plt.rcParams['font.size'] = 150 #字體的大小 ''' plt.figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True) 參數說明: 1.num:圖像編碼或名稱 2.figsize:圖片尺寸(row,clomun) 3.dpi:指定繪圖對象的分辨率(預設為80) 4.facecolor:背景颜色 5.edgecolor:邊框颜色 6.frameon:是否顯示邊框 plt.subplots(nrows,ncols,sharex,sharey,subplot_kw,**fig_kw) 参数说明: 1.nrows:行数 2.ncols:列数 3.sharex:共享x軸 4.sharey:共享y軸 5.subplot_kw:關鍵字字典 6.**fig_kw:其他關鍵字 plt.subplot(ijk)形式,其中ij是行列數,k是第幾個圖,比如(221)则是裡面有四個圖,該圖為第一個 fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(nrows=2, ncols=2, figsize=(10, 10)) ''' imgN= cv2.cvtColor(img, cv2.COLOR_BGR2RGB) plt.subplot(1,2,1) plt.imshow(imgN) plt.xticks([]), plt.yticks([])#省略x,y座標 plt.title('origin') result_new = cv2.cvtColor(img_new , cv2.COLOR_BGR2RGB) plt.subplot(1,2,2) plt.imshow(result_new) plt.xticks([]), plt.yticks([]) plt.title('resize newnew') ``` ![](https://i.imgur.com/6BUBhGh.png) **圖像旋轉** 圖像的旋轉就是讓圖像依據某一點旋轉指定的角度。 圖像旋轉後不會變形,但是其垂直對稱軸和水平對稱軸都會發生改變。 旋轉後的圖像的坐標和原圖像坐標之間的關係已不能通過簡單的加減乘法得到,需要通過一系列的複雜運算。 圖像在旋轉後其寬度和高度都會發生變換,其坐標原點會發生變換。 **cv2.getRotationMatrix2D** 計算旋轉參數 cv2.getRotationMatrix2D((cols/2, rows/2), 30, 1) 旋轉中心點、旋轉度數、scale(放大縮小) **cv2.warpAffine** 圖片旋轉 cv2.warpAffine(src, M, (cols, rows)) src-原始圖像、M-旋轉參數、(cols, rows)-原始圖像的寬和高 ![](https://i.imgur.com/NPntkKH.jpg) ```python= import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread('newnew.jpg') rows, cols = img.shape[:2] #讀取原影象的長和寬 #獲得旋轉參數 M = cv2.getRotationMatrix2D((cols / 2, rows / 2), 30, 0.8) #旋轉45度,縮小為0.8 rotated = cv2.warpAffine(img, M, (cols, rows)) #要注意是寬高 plt.rcParams['figure.figsize'] = [200, 100] plt.rcParams['font.size'] = 150 img2= cv2.cvtColor(img, cv2.COLOR_BGR2RGB) plt.subplot(1,2,1) plt.imshow(img2) plt.xticks([]), plt.yticks([]) plt.title('origin newnew') rotated2 = cv2.cvtColor(rotated , cv2.COLOR_BGR2RGB) plt.subplot(1,2,2) plt.imshow(rotated2) plt.xticks([]), plt.yticks([]) plt.title('rotated newnew') r=cv2.imwrite("new_resize.jpg",rotated) #儲存照片 ``` ![](https://i.imgur.com/OHK1jCN.jpg) 使用cv2.warpAffine()對影像做旋轉時,可以透過 cv2.getRotationMatrix2D()取得轉換矩陣M M = cv2.getRotationMatrix2D(center, angle, scale) center為旋轉中心 angle為旋轉角度,正數表示逆時鐘旋轉,負數表示順時鐘旋轉 scale為轉換尺度(縮放大小) **更複雜的仿射轉換** 可以使用cv2.getAffineTransform()的轉換矩陣M M= cv2.getAffineTransform(src, dst) 三個點分別對應平行四邊形的左上角、右上角、左下角 ```python= import cv2 import numpy as np img=cv2.imread('newnew.jpg') print(img.shape) rows,cols,ch=img.shape p1=np.float32([[0,0],[cols-1,0],[0,rows-1]])#左上,右上,左下(原圖位置) p2=np.float32([[cols*0.6,0],[cols*0.9,rows*0.9],[cols*0.2,rows*0.2]])#左上,右上,左下 M=cv2.getAffineTransform(p1,p2) #旋傳轉換矩陣M dst=cv2.warpAffine(img,M,(cols,rows)) cv2.imshow("newnew",img) cv2.imwrite("warp_newnew.jpg",dst) cv2.imshow("warp_newnew",dst) cv2.waitKey() cv2.destroyAllWindows() ``` ![](https://i.imgur.com/l1YGV8y.jpg) **圖像翻轉** cv2.flip cv2.flip(src, flipCode) flipCode為0,則以X軸為對稱軸翻轉 flipCode>0,則以Y軸為對稱軸翻轉 flipCode<0,則在X軸,Y軸方向同時翻轉 ```python= import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread('newnew.jpg') img1 = cv2.flip(img, 0) #以X軸為對稱軸翻轉 img2 = cv2.flip(img, 1) #以Y軸為對稱軸翻轉 img3 = cv2.flip(img, -1) #X軸,Y軸方向同時翻轉 plt.rcParams['figure.figsize'] = [200, 100] plt.rcParams['font.size'] = 150 img= cv2.cvtColor(img, cv2.COLOR_BGR2RGB) plt.subplot(1,4,1) plt.imshow(img) plt.xticks([]), plt.yticks([]) plt.title('origin newnew') img1 = cv2.cvtColor(img1 , cv2.COLOR_BGR2RGB) plt.subplot(1,4,2) plt.imshow(img1) plt.xticks([]), plt.yticks([]) plt.title('img1 new') img2 = cv2.cvtColor(img2 , cv2.COLOR_BGR2RGB) plt.subplot(1,4,3) plt.imshow(img2) plt.xticks([]), plt.yticks([]) plt.title('img2 new') img3 = cv2.cvtColor(img3 , cv2.COLOR_BGR2RGB) plt.subplot(1,4,4) plt.imshow(img3) plt.xticks([]), plt.yticks([]) plt.title('img3 new') ``` ![](https://i.imgur.com/1GZU4Bz.jpg)