计算机视觉基础8---几何变换
参考书目:《OpenCV计算机视觉基础教程》–夏帮贵。代码编写:Jupyter Notebook。# 1.缩放# 语法格式:dst = cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])# 参数说明:# a.dst:转换后的图像;# b.src:用于缩放的原图像;# c.dsize:转换后图像大小;# d.fx:水平方向的缩放比例;
·
参考书目:《OpenCV计算机视觉基础教程》–夏帮贵。
代码编写:Jupyter Notebook。
# 1.缩放
# 语法格式:dst = cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])
# 参数说明:
# a.dst:转换后的图像;
# b.src:用于缩放的原图像;
# c.dsize:转换后图像大小;
# d.fx:水平方向的缩放比例;
# e.fy:垂直方向的缩放比例;
# f.interpolation:插值方式;
# 插值方式:
# 1.cv2.INTER_NEAREST:最近邻插值;
# 2.cv2.INTER_LINEAR:双线性插值,默认方式;
# 3.cv2.INTER_CUBIC:3次样条插值;
# 4.cv2.INTER_AREA:区域插值;
# 5.cv2.INTER_LANCZOS4:Lanszos插值;
# 6.cv2.INTER_LINEAR_EXACT:位精确双线性插值;
# 7.cv2.INTER_MAX:插值编码掩码;
# 8.cv2.WARP_FILL_OUTLIERS:标志,填充目标图像中的所有像素;
# 9.cv2.WARP_INVERSE_MAP:标志,逆变换;
import cv2 as cv
img1 = cv.imread("apple.jpg")
img2 = cv.resize(img1, None,fx = 0.5,fy = 0.5) # 缩放到fx = 0.5,fy = 0.5;
cv.imshow("apple", img1)
cv.imshow("0.5apple", img2)
cv.waitKey(0)

# 2.翻转
# 语法格式:dst = cv2.flip(src, flipCode)
# 参数说明:
# a.dst:转换后的图像;
# b.src:原图像;
# c.flipCode:翻转类型;
# flip = 0:绕x轴翻转;flip大于0的整数时,绕y轴翻转;flip小于0的整数时,绕x轴和y轴同时翻转;
import cv2 as cv
img1 = cv.imread("apple.jpg")
while True:
"""
程序功能:
按【0】显示原图;
按【1】垂直翻转;
按【2】水平翻转;
按【3】水平、垂直同时翻转;
按【ESC】退出;
"""
key = cv.waitKey() & 0xFF
if key == 48:
img2 = img1
elif key == 49:
img2 = cv.flip(img1, 0)
elif key == 50:
img2 = cv.flip(img1, 1)
elif key == 51:
img2 = cv.flip(img1, -1)
cv.imshow("apple_flip", img2)
if key == 27:
break
cv.destroyAllWindows()

# 3.仿射
# 放射变换:平移、旋转、缩放;特点:原图像中的所有平行线在转换后的图像仍然平行;
# 语法格式:dst = cv2.warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]])
# 参数说明:
# a.dst:转换后的图像,图像类型和原图像一致,大小由dsize决定;
# b.src:原图像;
# c.M:一个2×3的转换矩阵,使用不同的转换矩阵可实现平移、旋转等多种操作;
# d.dsize:转换后的图像大小;
# e.flags:插值方式,默认值:cv2.INTER_LINEAR;
# f.borderMode:边类型,默认值:cv2.BORDER_CONSTANT;
# g.borderValue:边界值,默认值:0;
1.平移
- 平移:将图像沿着水平或垂直方向移动一定的像素;
- 假设将图像水平移动mmm个像素,垂直移动nnn个像素,则图像转换矩阵公式:dst(x,y)=src(x+m,y+n)dst(x, y) = src(x+m, y+n)dst(x,y)=src(x+m,y+n),转换矩阵如下:
M=[10m01n] M=\begin{bmatrix}1 & 0 & m \\ 0 & 1 & n\end{bmatrix} M=[1001mn]
import numpy as np
import cv2 as cv
img1 = cv.imread("apple.jpg")
height = img1.shape[0] # 图像高度
width = img1.shape[1] # 图像宽度
dsize = (width, height)
m1 = np.float32([[1, 0, 100], [0, 1, 50]])
m2 = np.float32([[1, 0, -100], [0, 1, -50]])
img2 = cv.warpAffine(img1, m1, dsize)
img3 = cv.warpAffine(img1, m2, dsize)
cv.imshow("apple", img1)
cv.imshow("apple_translation1", img2)
cv.imshow("apple_translation2", img3)
cv.waitKey(0)

2.缩放
- 假设图像的宽度缩放比例为hhh,高度缩放比例为vvv,根据图像转换矩阵运算公式,缩放转换矩阵为:
M=[h000v0] M=\begin{bmatrix}h & 0 & 0 \\ 0 & v & 0\end{bmatrix} M=[h00v00]
import cv2 as cv
import numpy as np
img1 = cv.imread("apple.jpg")
height = img1.shape[0]
width = img1.shape[1]
dsize = (width, height)
m1 = np.float32([[0.5, 0, 0], [0, 0.5, 0]])
m2 = np.float32([[0.25, 0, 0], [0, 0.25, 0]])
img2 = cv.warpAffine(img1, m1, dsize)
img3 = cv.warpAffine(img1, m2, dsize)
cv.imshow("apple", img1)
cv.imshow("apple_scale1", img2)
cv.imshow("apple_scale2", img3)
cv.waitKey(0)

3.旋转
- 执行旋转的函数:cv2.getRotationMatrix2D()cv2.getRotationMatrix2D()cv2.getRotationMatrix2D();
- 语法格式:m=cv2.getRotationMatrix2D(center,angle,scale)m = cv2.getRotationMatrix2D(center, angle, scale)m=cv2.getRotationMatrix2D(center,angle,scale);
- 参数说明:
- centercentercenter:原图像中作为旋转中心的坐标;
- angleangleangle:旋转角度,正数表示逆时针方向旋转,负数表示顺时针方向旋转;
- scalescalescale:目标图像与原图像的大小比例;
- 假设原图像宽度为widthwidthwidth,高度为heightheightheight,将图像中心作为旋转中心顺时针旋转60°,将图像缩小50%,则计算矩阵如下:
m=cv2.getRotationMatrix2D((width/2,height/2),−60,0.5) m=cv2.getRotationMatrix2D((width / 2, height / 2), -60, 0.5) m=cv2.getRotationMatrix2D((width/2,height/2),−60,0.5)
import cv2 as cv
img1 = cv.imread("apple.jpg")
height = img1.shape[0]
width = img1.shape[1]
dsize = (width, height)
m1 = cv.getRotationMatrix2D((width / 2, height / 2), -60, 0.5)
m2 = cv.getRotationMatrix2D((width / 2, height / 2), 60, 0.5)
img2 = cv.warpAffine(img1, m1, dsize)
img3 = cv.warpAffine(img1, m2, dsize)
cv.imshow("apple", img1)
cv.imshow("apple_rotation1", img2)
cv.imshow("apple_rotation2", img3)
cv.waitKey(0)

4.三点映射变换
- 三点映射变换:将图像转换为任意的平行四边形;
- 计算转换矩阵函数:cv2.getAffineTransform()cv2.getAffineTransform()cv2.getAffineTransform();
- 语法格式:m=cv2.getAffineTransform(src,dst)m=cv2.getAffineTransform(src, dst)m=cv2.getAffineTransform(src,dst);
- 参数说明:
- srcsrcsrc:原图像中3个点的坐标;
- dstdstdst:原图像中3个点在目标图像中的对应坐标;
import cv2 as cv
import numpy as np
img1 = cv.imread("apple.jpg")
height = img1.shape[0]
width = img1.shape[1]
dsize = (width, height)
src = np.float32([[0, 0], [width - 20, 0], [0, height - 5]])
dst = np.float32([[50, 50], [width - 100, 80], [100, height - 100]])
m = cv.getAffineTransform(src, dst)
img2 = cv.warpAffine(img1, m, dsize)
cv.imshow("apple", img1)
cv.imshow("apple_trans", img2)
cv.waitKey(0)

# 4.透视
# 透视:将图像转换为任意四边形;
# 透视特点:原始图像中的所有直线在转换后的图像仍然是直线;
# 语法格式:dst = cv2.warpPerspective(src, M, dsize[, flags[, borderMode[, borderValue]]]);
# 参数说明:
# a.dst:转换后的图像;
# b.src:用于缩放的原图像;
# c.M:大小为3×3的转换矩阵;
# d.dsize:转换后图像大小;
# e.flags:插值方式,默认值:cv2.INTER_LINEAR;
# f.borderMode:边类型,默认值:cv2.BORDER_CONSTANT;
# g.borderValue:边界值,默认值:0;
# 计算透视变换使用的转换矩阵:
# 语法格式:M = cv2.getPerspectiveTransform(src, dst)
# 参数说明:
# a.src:原图像中4个点的坐标;
# b.dst:原图像中4个点在转换后的目标图像中的对应坐标;
import cv2 as cv
import numpy as np
img1 = cv.imread("apple.jpg")
height = img1.shape[0]
width = img1.shape[1]
dsize = (width, height)
src = np.float32([[0, 0], [width - 10, 0], [0, height - 10], [width - 1, height - 1]])
dst = np.float32([[50, 50], [width - 50, 80], [50, height - 100], [width - 100, height - 10]])
m = cv.getPerspectiveTransform(src, dst)
img2 = cv.warpPerspective(img1, m, dsize)
cv.imshow("apple", img1)
cv.imshow("apple_perspective", img2)
cv.waitKey(0)

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)