[Python圖像處理] 六.圖像縮放、圖像旋轉、圖像翻轉與圖像平移

該系列文章是講解Python OpenCV圖像處理知識,前期主要講解圖像入門、OpenCV基礎用法,中期講解圖像處理的各類算法,包括圖像銳化算子、圖像加強技術、圖像分割等,後期結合深度學習研究圖像識別、圖像分類應用。但願文章對您有所幫助,若是有不足之處,還請海涵~html

該系列在github全部源代碼:https://github.com/eastmountyxz/ImageProcessing-Python
PS:請求幫忙點個Star,哈哈,第一次使用Github,之後會分享更多代碼,一塊兒加油。python

同時推薦做者的C++圖像系列知識:
[數字圖像處理] 一.MFC詳解顯示BMP格式圖片
[數字圖像處理] 二.MFC單文檔分割窗口顯示圖片
[數字圖像處理] 三.MFC實現圖像灰度、採樣和量化功能詳解
[數字圖像處理] 四.MFC對話框繪製灰度直方圖
[數字圖像處理] 五.MFC圖像點運算之灰度線性變化、灰度非線性變化、閾值化和均衡化處理詳解
[數字圖像處理] 六.MFC空間幾何變換之圖像平移、鏡像、旋轉、縮放詳解
[數字圖像處理] 七.MFC圖像加強之圖像普通平滑、高斯平滑、Laplacian、Sobel、Prewitt銳化詳解git

前文參考:
[Python圖像處理] 一.圖像處理基礎知識及OpenCV入門函數
[Python圖像處理] 二.OpenCV+Numpy庫讀取與修改像素
[Python圖像處理] 三.獲取圖像屬性、興趣ROI區域及通道處理
[Python圖像處理] 四.圖像平滑之均值濾波、方框濾波、高斯濾波及中值濾波
[Python圖像處理] 五.圖像融合、加法運算及圖像類型轉換github

本篇文章主要講解Python調用OpenCV實現圖像位移操做、旋轉和翻轉效果,包括四部分知識:圖像縮放、圖像旋轉、圖像翻轉、圖像平移。全文均是基礎知識,但願對您有所幫助。
1.圖像縮放
2.圖像旋轉
3.圖像翻轉
4.圖像平移web

PS:文章參考本身之前系列圖像處理文章及OpenCV庫函數,同時部分參考網易雲視頻,推薦你們去學習。同時,本篇文章涉及到《計算機圖形學》基礎知識,請你們下來補充。
推薦原理文章:OpenCV2:圖像的幾何變換,平移、鏡像、縮放、旋轉面試

投票閒談:
最後但願你們幫我2019年CSDN博客之星投投票,天天能夠投5票喔,截止時間2020年2月19日,謝謝你們!八年,在CSDN分享了410篇文章,15個專欄,400多萬人次瀏覽,包括Python人工智能、數據挖掘、網絡爬蟲、圖象處理、網絡安全、JAVA網站、Android開發、LAMP/WAMP、C#網絡編程、C++遊戲、算法和數據結構、面試總結、人生感悟等。固然還有我和你的故事,感恩一路有你,感謝一路同行,但願經過編程分享幫助到更多人,也但願學成以後回貴州教更多學生。由於喜歡,因此分享,且看且珍惜,加油!等我四年學成歸來~算法

投票地址:http://m234140.nofollow.ax.mvote.cn/opage/ed8141a0-ed19-774b-6b0d-39c3aaf89dde.html?from=singlemessage編程

在這裏插入圖片描述



一.圖像縮放

圖像縮放主要調用resize()函數實現,具體以下:
result = cv2.resize(src, dsize[, result[. fx[, fy[, interpolation]]]])
其中src表示原始圖像,dsize表示縮放大小,fx和fy也能夠表示縮放大小倍數,他們兩個(dsize或fx\fy)設置一個便可實現圖像縮放。例如:安全

  1. result = cv2.resize(src, (160,160))
  2. result = cv2.resize(src, None, fx=0.5, fy=0.5)

圖像縮放:設(x0, y0)是縮放後的座標,(x, y)是縮放前的座標,sx、sy爲縮放因子,則公式以下:
[ x 0 y 0 1 ] = [ x y 1 ] [ s x 0 0 0 s y 0 0 0 1 ] (1) \left[ \begin{matrix} x_0 & y_0 & 1 \end{matrix} \right] =\left[ \begin{matrix} x & y & 1 \end{matrix} \right] \left[ \begin{matrix} sx & 0 & 0 \\ 0 & sy & 0 \\ 0 & 0 & 1 \end{matrix} \right] \tag{1} 網絡

代碼示例以下所示:

#encoding:utf-8
import cv2  
import numpy as np  
 
#讀取圖片
src = cv2.imread('test.jpg')

#圖像縮放
result = cv2.resize(src, (200,100))
print result.shape

#顯示圖像
cv2.imshow("src", src)
cv2.imshow("result", result)

#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()

輸出結果以下圖所示,圖像縮小爲(200,100)像素。

須要注意的是,代碼中 cv2.resize(src, (200,100)) 設置的dsize是列數爲200,行數爲100。
一樣,能夠獲取原始圖像像素再乘以縮放係數進行圖像變換,代碼以下所示。

#encoding:utf-8
import cv2  
import numpy as np  
 
#讀取圖片
src = cv2.imread('test.jpg')
rows, cols = src.shape[:2]
print rows, cols

#圖像縮放 dsize(列,行)
result = cv2.resize(src, (int(cols*0.6), int(rows*1.2)))

#顯示圖像
cv2.imshow("src", src)
cv2.imshow("result", result)

#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()

輸出結果以下圖所示:

最後講解(fx,fy)縮放倍數的方法對圖像進行放大或縮小。

#encoding:utf-8
import cv2  
import numpy as np  
 
#讀取圖片
src = cv2.imread('test.jpg')
rows, cols = src.shape[:2]
print rows, cols

#圖像縮放
result = cv2.resize(src, None, fx=0.3, fy=0.3)

#顯示圖像
cv2.imshow("src", src)
cv2.imshow("result", result)

#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()

最後輸出的結果以下圖所示,這是按例比0.3*0.3縮小的。



2、圖像旋轉

圖像旋轉主要調用getRotationMatrix2D()函數和warpAffine()函數實現,繞圖像的中心旋轉,具體以下:

  • M = cv2.getRotationMatrix2D((cols/2, rows/2), 30, 1)
    參數分別爲:旋轉中心、旋轉度數、scale
  • rotated = cv2.warpAffine(src, M, (cols, rows))
    參數分別爲:原始圖像、旋轉參數、原始圖像寬高

圖像旋轉:設(x0, y0)是旋轉後的座標,(x, y)是旋轉前的座標,(m,n)是旋轉中心,a是旋轉的角度,(left,top)是旋轉後圖像的左上角座標,則公式以下:
[ x 0 y 0 1 ] = [ x y 1 ] [ 1 0 0 0 1 0 m n 1 ] [ c o s a s i n a 0 s i n a c o s a 0 0 0 1 ] [ 1 0 0 0 1 0 l e f t t o p 1 ] (1) \left[ \begin{matrix} x_0 & y_0 & 1 \end{matrix} \right] = \left[ \begin{matrix} x & y & 1 \end{matrix} \right] \left[ \begin{matrix} 1 & 0 & 0 \\ 0 & -1 & 0 \\ -m & n & 1 \end{matrix} \right] \left[ \begin{matrix} cosa & -sina & 0 \\ sina & cosa & 0 \\ 0 & 0 & 1 \end{matrix} \right] \left[ \begin{matrix} 1 & 0 & 0 \\ 0 & -1 & 0 \\ left & top & 1 \end{matrix} \right] \tag{1}

代碼以下所示:

#encoding:utf-8
import cv2  
import numpy as np  
 
#讀取圖片
src = cv2.imread('test.jpg')

#原圖的高、寬 以及通道數
rows, cols, channel = src.shape

#繞圖像的中心旋轉
#參數:旋轉中心 旋轉度數 scale
M = cv2.getRotationMatrix2D((cols/2, rows/2), 30, 1)
#參數:原始圖像 旋轉參數 元素圖像寬高
rotated = cv2.warpAffine(src, M, (cols, rows))

#顯示圖像
cv2.imshow("src", src)
cv2.imshow("rotated", rotated)

#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()

輸出結果以下圖所示:

若是設置-90度,則核心代碼和圖像以下所示。
M = cv2.getRotationMatrix2D((cols/2, rows/2), -90, 1)
rotated = cv2.warpAffine(src, M, (cols, rows))



3、圖像翻轉

圖像翻轉在OpenCV中調用函數flip()實現,原型以下:
dst = cv2.flip(src, flipCode)
其中src表示原始圖像,flipCode表示翻轉方向,若是flipCode爲0,則以X軸爲對稱軸翻轉,若是fliipCode>0則以Y軸爲對稱軸翻轉,若是flipCode<0則在X軸、Y軸方向同時翻轉。

代碼以下所示:

#encoding:utf-8
import cv2  
import numpy as np
import matplotlib.pyplot as plt
 
#讀取圖片
img = cv2.imread('test.jpg')
src = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)

#圖像翻轉
#0以X軸爲對稱軸翻轉 >0以Y軸爲對稱軸翻轉 <0X軸Y軸翻轉
img1 = cv2.flip(src, 0)
img2 = cv2.flip(src, 1)
img3 = cv2.flip(src, -1)

#顯示圖形
titles = ['Source', 'Image1', 'Image2', 'Image3']  
images = [src, img1, img2, img3]  
for i in xrange(4):  
   plt.subplot(2,2,i+1), plt.imshow(images[i], 'gray')  
   plt.title(titles[i])  
   plt.xticks([]),plt.yticks([])  
plt.show()

輸出結果以下圖所示:



4、圖像平移

圖像平移:設(x0, y0)是縮放後的座標,(x, y)是縮放前的座標,dx、dy爲偏移量,則公式以下:
[ x 0 y 0 1 ] = [ x y 1 ] [ 1 0 0 0 1 0 d x d y 1 ] (3) \left[ \begin{matrix} x_0 & y_0 & 1 \end{matrix} \right] =\left[ \begin{matrix} x & y & 1 \end{matrix} \right] \left[ \begin{matrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ dx & dy & 1 \end{matrix} \right] \tag{3}

圖像平移首先定義平移矩陣M,再調用warpAffine()函數實現平移,核心函數以下:
M = np.float32([[1, 0, x], [0, 1, y]])
shifted = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))

完整代碼以下所示:

#encoding:utf-8
import cv2  
import numpy as np
import matplotlib.pyplot as plt
 
#讀取圖片
img = cv2.imread('test.jpg')
image = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)

#圖像平移 下、上、右、左平移
M = np.float32([[1, 0, 0], [0, 1, 100]])
img1 = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))

M = np.float32([[1, 0, 0], [0, 1, -100]])
img2 = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))

M = np.float32([[1, 0, 100], [0, 1, 0]])
img3 = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))

M = np.float32([[1, 0, -100], [0, 1, 0]])
img4 = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))

#顯示圖形
titles = [ 'Image1', 'Image2', 'Image3', 'Image4']  
images = [img1, img2, img3, img4]  
for i in xrange(4):  
   plt.subplot(2,2,i+1), plt.imshow(images[i], 'gray')  
   plt.title(titles[i])  
   plt.xticks([]),plt.yticks([])  
plt.show()

輸出結果以下圖所示:

三尺講臺,三寸舌, 三千桃李,三杆筆。 再累再苦,站在講臺前就是最美的本身,幾個月的煩惱和憂愁都已消失,真的好享受這種狀態,彷彿散着光芒,終於給低年級的同窗上課了越早培養編程興趣越好,恨不能傾囊相授。 即便當一生的教書匠,平平淡淡也喜歡,並且總感受給學生講課遠不是課酬和職稱所能比擬,這就是所謂的事業,所謂的愛好。 但願文章對你們有所幫助,若是有錯誤或不足之處,還請海涵。 準備出去休回家了,好好享受最美時光。 (By:Eastmount 2018-09-06 早10點 https://blog.csdn.net/Eastmount/)