图像的几何变换是在不改变图像内容的情况下对图像进行空间几何变换。
图片建议单击打开阅读:
1、图像缩放:
cv2.resize(src,dsize,dst=None,fx=None,fy=None,interpolation=None)
(提示:当一个参数默认等于None时是可选参数有默认值)
- src:处理待图像对象
- dsize:指定待图像 列 和 行 的像素值 (当dsize=None时,图像的缩放由fx与fy决定)
- dst:处理后的图像对象
- fx:width方向的缩放比例,如果它是0,那么它就会按照(double)dsize.width/src.cols来计算
- fy:height方向的缩放比例,如果它是0,那么它就会按照(double)dsize.height/src.rows来计算
- interpolation:指定插值的方式,图像缩放之后重新计算像素的方式,有以下几种:
命令 | 方式 |
---|---|
INTER_NEAREST | 最邻近插值 |
INTER_LINEAR | 双线性插值 (默认) |
INTER_CUBIC | 4x4像素邻域内的双立方插值 |
INTER_LANCZOS4 | 8x8像素邻域内的Lanczos插值 |
INTER_AREA | 使用像素区域关系进行重采样 |
import cv2
img = cv2.imread("first.jpg") #read
imgRe1 = cv2.resize(img,(600,600),interpolation=cv2.INTER_AREA)
imgRe2 = cv2.resize(img,None,fx=0.5,fy=0.5)
cv2.imshow("RE1",imgRe1) #show
cv2.imshow("RE2",imgRe2)
cv2.imshow("img",img)
cv2.waitKey()
cv2.destroyAllWindows()
2、图像平移:
图像平移是将图像沿着指定方向进行移动,在二维平面内主要是沿着x、y轴进行移动。
可以使用OpenCV中的仿射变换函数warpAffine配合自定义矩阵来实现
cv2.warpAffine(src,M,dsize,dst=None,flags=None,borderValue=None)
-
src: 是指原图像
-
M: mat:是平移矩阵
mat矩阵是一个2行3列矩阵,其中x, y为两个方向所移动的距离
每个像素点都与这个2x2的矩阵相乘:
- dsize:是一个元祖,是平移后图像大小
- dst:处理后的图像
- flags:插值的方式
flags | 插值方式 |
---|---|
cv2.INTER_LINEAR | 线性插值(默认) |
cv2.INTER_NEAREST | 最近邻插值 |
cv2.INTER_AREA | 区域插值 |
cv2.INTER_CUBIC | 三次样条插值 |
cv2.INTER_LANCZOS4 | Lanczos插值 |
- borderValue:变换后的边界填充色,BGR格式,默认为黑色
import cv2
import numpy as np
img = cv2.imread("first.jpg")
M = np.float32([[1,0,10],[0,1,10]])
width , height = img.shape[0:2] #获取图像的行和列
imgRe = cv2.warpAffine(img,M,(width+10,height+10),borderValue=(255,255,255))
#M要求为 float 类型 一般使用np.float32
cv2.imshow("Reimg",imgRe)
cv2.imshow("img",img)
cv2.waitKey()
cv2.destroyAllWindows()
3、图像的旋转:
即将图像整体以指定点为中心进行旋转
我们首先获取仿射旋转变换矩阵:
cv2.getRotationMatrix2D(center,angle,scale)
- center:旋转中心 (一般用图像的 行 和 宽 确定图像中心)
- angle:旋转的角度
- scale:缩放程度
然后我们进行仿射变换:
cv2.warpAffine(src,M,dsize,dst=None,flags=None,borderValue=None)
-
src: 是指原图像
-
M: mat:是仿射矩阵
mat矩阵是一个2行3列矩阵,其中x, y为两个方向所移动的距离
每个像素点都与这个2x2的矩阵相乘:
- dsize:是一个元祖,是平移后图像大小
- dst:处理后的图像
- flags:插值的方式
flags | 插值方式 |
---|---|
cv2.INTER_LINEAR | 线性插值(默认) |
cv2.INTER_NEAREST | 最近邻插值 |
cv2.INTER_AREA | 区域插值 |
cv2.INTER_CUBIC | 三次样条插值 |
cv2.INTER_LANCZOS4 | Lanczos插值 |
- borderValue:变换后的边界填充色,BGR格式,默认为黑色
import cv2
img = cv2.imread("~/hello.jpg") #read
width , height = img.shape[0:2] #利用切片 获取 行 和 列
M = cv2.getRotationMatrix2D((width/2,height/2),45,0.9) #获取仿射矩阵
imgRo = cv2.warpAffine(img,M,None,borderValue=(255,255,255)) #仿射变换
cv2.imshow("reImg",imgRo)
cv2.imshow("Img",img)
cv2.waitKey()
cv2.destroyAllWindows()
练习题4:
将一个图像一个以彩色模式读取旋转55度缩小1倍,一个以灰度模式读取旋转32度扩大一倍,并且都向平移y轴平移55个像素,并显示。
评论出你的答案