文章目录
准备图片
选择一张shape为(500,500,3)的梵高的《星月夜》以便示例。
1. 缩放 cv2.resize()方法
cv2.resize(src, dsize, dst=None, fx=None, fy=None, interpolation=None)
- src 原图(的数组)
- dsize: 输出图像的大小 格式:(a,b)。
设定dsize后就无需再设置fx和fy - fx 可选参数 水平方向缩放比
- fy 可选参数 垂直方向缩放比
import cv2 img = cv2.imread("The_Starry_Night.jpg") dst1 = cv2.resize(img, (200, 200)) dst2 = cv2.resize(img, (900, 900)) cv2.imshow("img", img) cv2.imshow("dst1", dst1) cv2.imshow("dst2", dst2) cv2.waitKey() cv2.destroyAllWindows()
执行结果如图所示,相比原图,图像得到了指定大小的缩小与放大。
使用fx和fy参数,则需要手动把dsize设为None。
import cv2 img = cv2.imread("The_Starry_Night.jpg") # 将宽缩小到原来的1/3、高缩小到原来的1/2 dst3 = cv2.resize(img, None, fx=1 / 3, fy=1 / 2) # 将宽高扩大2倍 dst4 = cv2.resize(img, None, fx=2, fy=2) cv2.imshow("img", img) cv2.imshow("dst3", dst3) cv2.imshow("dst4", dst4) cv2.waitKey() cv2.destroyAllWindows()
结果呈现:
2. 翻转 cv2.flip()方法
flip(src, flipCode, dst=None)
- src 图像(数组)
- flipCode 翻转代码。可以是0,正数,负数。0表示沿X轴(水平方向的轴)翻转。1表示沿Y轴(竖直方向的轴)翻转。
负数表示同时沿X轴和Y轴翻转。
讲原图经过着三种翻转后,与原图拼在一块,呈现出了这种奇观:
import cv2 img = cv2.imread("The_Starry_Night.jpg") dst1 = cv2.flip(img, 0) dst2 = cv2.flip(img, 1) dst3 = cv2.flip(img, -1) cv2.imshow("img", img) cv2.imshow("dst1", dst1) cv2.imshow("dst2", dst2) cv2.imshow("dst3", dst3) cv2.waitKey() cv2.destroyAllWindows()
将翻转结果放在同一张画布中
import cv2 import numpy as np img = cv2.imread("The_Starry_Night.jpg") dst1 = cv2.flip(img, 0) dst2 = cv2.flip(img, 1) dst3 = cv2.flip(img, -1) a, b, c = img.shape canvas = np.ones((2 * a, 2 * b, c), np.uint8) * 255 canvas[0:b, 0:a] = img canvas[b:2*b, 0:a] = dst1 canvas[0:b, a:2*a] = dst2 canvas[b:2*b, a:2*a] = dst3 cv2.imshow("pic", canvas) cv2.waitKey() cv2.destroyAllWindows() # 保存图片 # cv2.imwrite("final_pic", canvas)
结果呈现:
3. 仿射变换 warpAffine()方法
常见的仿射变换有平移,旋转和倾斜变换。
仿射变换使用cv2.warpAffine()方法完成
warpAffine(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None)
- src 原图
- M 是一个二行三列的矩阵,也称仿射矩阵。warpAffine方法根据此矩阵的值来变换像素的位置。
M = [[a, b, c], [d, e, f]],则像素的变换公式为:
X = x × a + y × b + c
Y = x × d + y × e + f
其中x,y指原像素的x、y轴坐标。X,Y指变换后的X,Y坐标。
- dsize 输出图像的尺寸。(不带放缩,增大的部分用黑色色素(0)填充)
这三个参数是常用的参数。其余参数建议使用默认值。
flags表示插入方式,borderMode是边界类型,borderValue表示边界值(默认0)。dst表示反射变换后输出的图像。