今天小编主要介绍如何通过OpenCV来实现图像的基本变换操作:平移、旋转、缩放和倾斜。我们话不多说,直接上干货。
1、平移
#图像平移
import cv2
import numpy as np
from opencv_jupyter_ui import cv2_imshow
#导入图片
dog = cv2.imread('./images/dog.png')
h, w = dog.shape[:2]
M = np.float32([[1, 0, 100], [0, 1, 50]]) # 向右平移 100 像素,向下平移 50 像素
translated_img = cv2.warpAffine(dog, M, (w+100, h+50))
cv2_imshow('dog',dog)
cv2_imshow('translated_img',translated_img)
2、缩放
import cv2
import numpy as np
from opencv_jupyter_ui import cv2_imshow
dog=cv2.imread('./images/dog.png')
#缩小为原来的一半
new_dog=cv2.resize(dog, dsize=None, fx=0.5, fy=0.5, interpolation=cv2.INTER_LINEAR)
cv2_imshow('new_dog',new_dog)
cv2_imshow('dog',dog)

3、翻转
# flip(src, flipCode)
# flipCode =0表示上下翻转
# flipCode >0表示左右翻转
# flipCode <0上下+左右
import cv2
import numpy as np
from opencv_jupyter_ui import cv2_imshow
dog=cv2.imread('./images/dog.png')
new_dog1=cv2.flip(dog, flipCode=0)
new_dog2=cv2.flip(dog, flipCode=1)
new_dog3=cv2.flip(dog, flipCode=-1)
new_dog=dog[::-1,::-1]
cv2_imshow('dog',dog)
cv2_imshow('dog1',np.hstack((new_dog1,new_dog2)))
cv2_imshow('dog2',np.hstack((new_dog3,new_dog)))

4、旋转
# 图像旋转
import cv2
import numpy as np
from opencv_jupyter_ui import cv2_imshow
#导入图片
dog = cv2.imread('./images/dog.png')
(h, w) = dog.shape[:2]
center = (w // 2, h // 2)
M = cv2.getRotationMatrix2D(center, 45, 1.0) # 旋转 45 度
rotated_img = cv2.warpAffine(dog, M, (w, h))
cv2_imshow('rotated_img',rotated_img)
5、倾斜
# 图像倾斜
# OpenCV需要定位图像的三个点来计算倾斜效果,这三个点分别是左上角 右上角和左下角,这样可以保证图像的平直性和平行性
# 同样有getAffineTransform方法来自动计算倾斜图像的M矩阵
# M=cv2.getAffineTransform(src,dst)
# src 原图三个点的坐标 格式为三行两列的浮点数列表
# dst 倾斜图像的三个点坐标 格式与src一样
import cv2
import numpy as np
from opencv_jupyter_ui import cv2_imshow
img = cv2.imread("./images/dog.png") # 读取图像
rows = len(img) # 图像像素行数
cols = len(img[0]) # 图像像素列数
p1 = np.zeros((3, 2), np.float32) # 32位浮点型空列表,原图三个点
p1[0] = [0, 0] # 左上角点坐标
p1[1] = [cols - 1, 0] # 右上角点坐标
p1[2] = [0, rows - 1] # 左下角点坐标
p2 = np.zeros((3, 2), np.float32) # 32位浮点型空列表,倾斜图三个点
p2[0] = [50, 0] # 左上角点坐标,向右挪50像素
p2[1] = [cols - 1, 0] # 右上角点坐标,位置不变
p2[2] = [0, rows - 1] # 左下角点坐标,位置不变
M = cv2.getAffineTransform(p1, p2) # 根据三个点的变化轨迹计算出M矩阵
dst = cv2.warpAffine(img, M, (cols, rows)) # 按照M进行仿射
cv2_imshow('img', np.hstack((img, dst))) # 显示原图和显示仿射变换效果图


全部评论