【opencv+python】影象的基本操作:縮放、剪下、位移、旋轉、仿射變換
阿新 • • 發佈:2020-08-12
1.縮放
程式碼:
# 使用resize函式實現圖片縮放
import cv2
src = cv2.imread("C:/360Downloads/1.jpg", 1)
cv2.imshow("src", src)
srcInfo = src.shape
height = srcInfo[0]
width = srcInfo[1]
dstHeight = int(height * 0.5)
dstWidth = int(width * 0.5)
dst = cv2.resize(src, (dstWidth, dstHeight))
cv2.imshow("dst", dst)
cv2.waitKey(0)
# 使用warpAffine函式實現圖片縮放
import cv2
import numpy as np
src = cv2.imread("C:/360Downloads/1.jpg", 1)
cv2.imshow("src", src)
srcInfo = src.shape
height = int(srcInfo[0]/2)
width = int(srcInfo[1]/2)
# 將圖片縮小為原來的一半:
# xNew = x * 0.5
# yNew = y * 0.5
# xNew = x * A1 + y * A2 + B1
# yNew = x * A3 + y * A4 + B2
# np.float32([[A1, A3, B1],
# [A2, A4, B2]])
matScale = np.float32([[0.5, 0, 0],
[0, 0.5, 0]])
dst = cv2.warpAffine(src, matScale, (width, height))
cv2.imshow("dst", dst)
cv2.waitKey(0)
效果:
2.剪下
程式碼:
# 圖片剪下
import cv2
src = cv2.imread("C:/360Downloads/1.jpg", 1)
cv2.imshow( "src", src)
# [行,列]
dst = src[100:200, 100:300]
cv2.imshow("dst", dst)
cv2.waitKey(0)
效果:
3.位移
程式碼:
# 影象位移
import cv2
import numpy as np
src = cv2.imread("C:/360Downloads/1.jpg", 1)
cv2.imshow("src", src)
srcInfo = src.shape
height = srcInfo[0]
width = srcInfo[1]
# 左移100,下移200:
# xNew = x + 100
# yNew = y + 200
# xNew = x * A1 + y * A2 + B1
# yNew = x * A3 + y * A4 + B2
# np.float32([[A1, A3, B1],
# [A2, A4, B2]])
matShift = np.float32([[1, 0, 100], [0, 1, 200]])
dst = cv2.warpAffine(src, matShift, (width, height))
cv2.imshow("dst", dst)
cv2.waitKey(0)
效果:
4.旋轉
程式碼:
# 旋轉影象
import cv2
src = cv2.imread("C:/360Downloads/1.jpg", 1)
cv2.imshow("src", src)
srcInfo = src.shape
height = srcInfo[0]
width = srcInfo[1]
# getRotationMatrix2D 函式可獲取旋轉的仿射矩陣
# 引數依次為(旋轉中心,旋轉角度,縮放比例)
matRotate = cv2.getRotationMatrix2D((0, 0), 45, 0.5)
dst = cv2.warpAffine(src, matRotate, (width, height))
cv2.imshow("dst", dst)
cv2.waitKey(0)
效果:
5.仿射變換
程式碼:
# 仿射變換
import cv2
import numpy as np
src = cv2.imread("C:/360Downloads/1.jpg", 1)
cv2.imshow("src", src)
srcInfo = src.shape
height = srcInfo[0]
width = srcInfo[1]
# 三點確定一個平面
# getAffineTransform 函式可獲取仿射矩陣
# 引數依次為(源影象的三點座標,目標影象的三點座標)
# 三點分別為(左上角,左下角,右上角)
matSrc = np.float32([[0, 0], [0, height - 1], [width - 1, 0]])
matDst = np.float32([[50, 50], [150, height - 100], [width - 100, 150]])
matAffine = cv2.getAffineTransform(matSrc, matDst)
dst = cv2.warpAffine(src, matAffine, (width, height))
cv2.imshow("dst", dst)
cv2.waitKey(0)
效果: