图像变换:
- cv2.flip() # 图像翻转
- cv2.resize() #图像尺寸变换
- cv2.warpAffine() #图像仿射
- cv2.getRotationMatrix2D() #取得旋转角度的Matrix
- cv2.GetAffineTransform(src, dst, mapMatrix) #取得图像仿射的matrix
- cv2.getPerspectiveTransform(src, dst) #取得投影变换矩阵的4个点起止值
- cv2.warpPerspective() #图像投影变换
1.图像翻转cv2.flip()
cv2.flip(src, flipCode[, dst]) → dst
flipMode: 翻转模式。有三种模式:0 --- 垂直方向翻转; 1----- 水平方向翻转; -1:水平、垂直方向同时翻转
import cv2
img = cv2.imread(r'C:\Users\x\Desktop\11.jpg', cv2.IMREAD_ANYCOLOR)
#水平翻转
h_flip = cv2.flip(img, 1)
#垂直翻转
v_flip = cv2.flip(img, 0)
#水平垂直翻转
hv_flip = cv2.flip(img, -1)
cv2.imshow("img", img)
cv2.imshow("h_flip", h_flip)
cv2.imshow("v_flip", v_flip)
cv2.imshow("hv_flip", hv_flip)
cv2.waitKey(0)
cv2.destroyAllWindows()
2.图像尺寸变cv2.resize()
cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]]) -> dst
dsize - 目标图像大小。
interpolation - 插值方法:
1)INTER_NEAREST - 最近邻插值法
2)INTER_LINEAR - 双线性插值法(默认)
3)INTER_AREA - 基于局部像素的重采样(resampling using pixel area relation)。对于图像抽取(image decimation)来说,这可能是一个更好的方法。但如果是放大图像时,它和最近邻法的效果类似。
4)INTER_CUBIC - 基于4x4像素邻域的3次插值法
5)INTER_LANCZOS4 - 基于8x8像素邻域的Lanczos插值
import cv2
img = cv2.imread(r'C:\Users\x\Desktop\79.jpg', cv2.IMREAD_ANYCOLOR)
h, w = img.shape[:2]
h_new, w_new = h*0.25, w*0.25
h_new = int(round(h_new))
w_new = int(round(w_new))
new_img = cv2.resize(img, (h_new, w_new), interpolation=cv2.INTER_CUBIC)
cv2.imshow('img',img)
cv2.imshow('resize', new_img)
cv2.imwrite(r'C:\Users\x\Desktop\11.jpg', new_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
3.图像仿射变换
cv2.warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]])
仿射变换函数:warpAffine(src, (2行3列的仿射变换矩阵A), (w, h)(输出图像大小宽、高), 填充模式)
cv2.getRotationMatrix2D(center, angle, scale)
旋转函数:getRotationMatrix2D(center(图片的旋转中心), angle(旋转角度), scale(等比例缩放系数))
import cv2
import numpy as np
if __name__ == "__main__":
image = cv2.imread(r'C:\Users\x\Desktop\11.jpg', cv2.IMREAD_ANYCOLOR)
#原图的高、宽
h, w = image.shape[:2]
#仿射变换矩阵,缩小两倍,不进行平移
A1 = np.array([[0.5, 0, 0], [0, 0.5, 0]], np.float32)
d1 = cv2.warpAffine(image, A1, (w,h), borderValue=125)
#先缩小两倍再平移w/4和h/4个距离
A2 = np.array([[0.5, 0, w/4], [0, 0.5, h/4]], np.float32)
d2 = cv2.warpAffine(image, A2, (w,h), borderValue=125)
#在d2的基础上,绕图像中心点旋转30°,缩放0.5倍
A3 = cv2.getRotationMatrix2D((w/2.0, h/2.0), 30, 1) #getRotationMatrix2D(center, angle, scale(等比例缩放系数))
d3 = cv2.warpAffine(d2, A3, (w,h), borderValue=125)
cv2.imshow("image", image)
cv2.imshow("d1", d1)
cv2.imshow("d2", d2)
cv2.imshow("d3", d3)
cv2.waitKey(0)
cv2.destroyAllWindows()
4.图像投影变换
cv2.getPerspectiveTransform(src, dst) → retval
cv2.warpPerspective(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]]) → dst
视角变换,需要一个3*3变换矩阵。在变换前后要保证直线还是直线。
构建此矩阵需要在输入图像中找寻 4个点,以及在输出图像中对应的位置。这四个点中的任意三个点不能共线。
#投影变换
import cv2
import numpy as np
#灰度图像转化为ndarray类型
if __name__ == "__main__":
img = cv2.imread(r'C:\Users\x\Desktop\11.jpg', cv2.IMREAD_ANYCOLOR)
h, w = img.shape[:2]
#原图的四个点与投影变换对应的点
src = np.array([[0,0], [w-1,0], [0,h-1], [w-1,h-1]], np.float32)
dst = np.array([[50,50], [w/3.0,50], [50,h-1], [w-1,h-1]], np.float32)
#计算投影变换矩阵
p = cv2.getPerspectiveTransform(src, dst)
#计算投影变换
r = cv2.warpPerspective(img, p, (h,w), borderValue=125)
cv2.imshow("img", img)
cv2.imshow("r", r)
cv2.waitKey(0)
cv2.destroyAllWindows()