OpenCV_05图像变换

前言:总纲请查看《计算机视觉学习路》

缩放

resize(src , dst , dsize , fx , fy , interpolation)

源,目的–python中不需要dst这个参数,目标的大小,x,y轴的缩放因子,插值算法
如果设置了dsize,就不需要设置fx,fy,二者选其一
插值算法:临近插值INTER_NEAREST,双线性插值(默认)INTER_LINEAR,三次插值INTER_CUBIC,INTER_AREA插值

import cv2
import numpy as np

img = cv2.imread('../img/ex03.jpg')
print(img.shape)  #676 1202 3
# 缩放成指定大小
new = cv2.resize(img,(400,400))
# 按fx,fy缩放:  三次插值
new2 = cv2.resize(img,None,fx=0.3,fy=0.3,interpolation=cv2.INTER_CUBIC)

cv2.imshow('img',img)
cv2.imshow('new',new)
cv2.imshow('new2',new2)

cv2.waitKey(0)

翻转

flip(img , flipCode) # flipCode=0 上下翻转; >0 左右翻转 ; <0 上下+左右翻转

import cv2

img = cv2.imread('../img/ex03.jpg')
img = cv2.resize(img,None,fx=0.5,fy=0.5)

# 上下翻转
img1 = cv2.flip(img, 0)

# 左右翻转
img2 = cv2.flip(img, 1)

# 上下加左右
img3 = cv2.flip(img, -1)

cv2.imshow('img', img)
cv2.imshow('img1', img1)
cv2.imshow('img2', img2)
cv2.imshow('img3', img3)

cv2.waitKey(0)

旋转

rotate(img, rotateCode)

rotateCode:
ROTATE_90_CLOCKWISE , 旋转90度
ROTATE_180 , 旋转180度
ROTATE_90_COUNTERCLOCKWISE , 旋转270度(反向旋转90度)

import cv2

img = cv2.imread('../img/ex03.jpg')
img = cv2.resize(img, None, fx=0.5, fy=0.5)

img1 = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE)
img2 = cv2.rotate(img, cv2.ROTATE_180)
img3 = cv2.rotate(img, cv2.ROTATE_90_COUNTERCLOCKWISE)

cv2.imshow('img', img)
cv2.imshow('img1', img1)
cv2.imshow('img2', img2)
cv2.imshow('img3', img3)

cv2.waitKey(0)

仿射变换

仿射变换是图像旋转、缩放、平移的总称
warpAffine(src , M , dsize , flags , mode , value)

M:变换矩阵
dsize 输出大小
flag 和resize中的插值算法一致
mode 边界外推法
value 填充边界的值

平移

OpenCV_05图像变换_第1张图片

import cv2
import numpy as np

img = cv2.imread('../img/ex03.jpg')
img = cv2.resize(img, None, fx=0.5, fy=0.5)

# 向右平移100个点
M = np.float32([[1, 0, 100], [0, 1, 0]])
h,w,c = img.shape
img1 = cv2.warpAffine(img,M,(w,h))

cv2.imshow('img', img)
cv2.imshow('img1', img1)

cv2.waitKey(0)

变换矩阵

简单的平移矩阵我们可以自己指定,如果变化复杂,我们怎么获得变换矩阵呢?

getRotationMatrix2D(center , angle , scale)
center : 中心点
angle : 角度(逆时针)
scale : 缩放比例

OpenCV_05图像变换_第2张图片

import cv2
import numpy as np

img = cv2.imread('../img/ex03.jpg')
img = cv2.resize(img,None,fx=0.5,fy=0.5)
h,w,c = img.shape

#获取变换矩阵M
M = cv2.getRotationMatrix2D((w/2,h/2),60,1.0)

# 不改变原图的尺寸所以传入(w,h)
img1 = cv2.warpAffine(img,M,(w,h))

cv2.imshow('img', img)
cv2.imshow('img1', img1)

cv2.waitKey(0)

还可以通过变换前后点的坐标获取变换矩阵(三个点可以确定)
getAffineTransform(src[ ], dst[ ])

OpenCV_05图像变换_第3张图片

import cv2
import numpy as np

img = cv2.imread('../img/ex03.jpg')
h, w, c = img.shape

src = np.float32([[400,300],[800,300],[400,1000]])
dst = np.float32([[200,400],[600,500],[150,1100]])
# 第二种获取仿射变化图片的方法:通过变换前后点的坐标
M = cv2.getAffineTransform(src,dst)

img1 = cv2.warpAffine(img, M, (w, h))

cv2.imshow('img', img)
cv2.imshow('img1', img1)

cv2.waitKey(0)

透视变换

warpPerspective(img , M , dsize, …)

获取变换矩阵:

getPersectiveTransform(src , dst) # 需要四个坐标点(图形的四个角)

OpenCV_05图像变换_第4张图片

import numpy as np
import cv2

im = cv2.imread('../img/pers.png')
h, w = im.shape[:2]  # 取出高度和宽度

# 设置透视变换的原点和目标点
pts1 = np.float32([[58, 2], [167, 9], [8, 196], [126, 196]])  # 输入图像四个顶点坐标
pts2 = np.float32([[16, 2], [167, 8], [8, 196], [169, 196]])  # 输出图像四个顶点坐标

# 生成透视变换矩阵
M = cv2.getPerspectiveTransform(pts1,  # 输入图像四个顶点坐标
                                pts2)  # 输出图像四个顶点坐标

# 执行透视变换
dst = cv2.warpPerspective(im, M, (w, h))

cv2.imshow('im', im)
cv2.imshow('dst', dst)

cv2.waitKey()
cv2.destroyAllWindows()

你可能感兴趣的:(计算机视觉,opencv,计算机视觉,python)