图像的缩放
图像缩放API
resize(src,dst,dsize,fx,fy,interpolation)
src:图像源,就是对哪个图像进行缩放操作
dst:输出图像,在python中通过resize赋值方式,不用在括号中填写
dsize:变换后图像的大小
fx,fy:x轴,y轴的缩放因子(如果fx设为0.7就是代表原图x的0.7倍)
注意dsize与fx,fy有冲突,设置其中一个另一个就不用设定了(默认使用dsize)
interpolation:插值算法
插值算法:INTER_NEAREST 临近插值,速度快,效果差(放大直接在放大的边上取像素直接进行拷贝,进行放大操作)
INTER_LINEAR 双线插值,使用周围4个点形成插值点(默认算法)
INTER_CUBIC 三次插值,使用周围16个点形成插值点
INTER_AREA 效果最好,但是速度慢
图像缩放实战代码
import cv2
import numpy as np
ww = cv2.imread('../MM/preview.jpg')
new = cv2.resize(ww, (250, 400)) # 由于比例不对,导致新的图片出现拉伸现象
cv2.imshow('ww', ww)
cv2.imshow('new', new)
cv2.waitKey(0)
第一幅为原图,第二幅通过直接大小变换得到的,出现了拉伸的现象,所以在设置大小的时候需要先了解好原图的比例关系。可以通过shape函数得到原图信息。
还可以通过变换比例得到图片。
new=cv2.resize(ww,None,fx=0.3,fy=0.3,interpolation=cv2.INTER_AREA) #自身不设置图片大小,设置图片比例
图像翻转
图像翻转API
flip(img,flipCode)
img:就是对哪张图片进行翻转
flipCode:flipCode==0 上下翻转 flipCode>0 左右翻转 flipCode<0上下+左右 翻转
图像翻转实战代码
import cv2
import numpy as np
ww = cv2.imread('../MM/preview.jpg')
shangxia = cv2.flip(ww, 0)
zuoyou = cv2.flip(ww, 1)
shangxiazuoyou = cv2.flip(ww, -1)
cv2.imshow('ww', ww)
cv2.imshow('shangxia', shangxia)
cv2.imshow('zuoyou', zuoyou)
cv2.imshow('shangxiazuoyou', shangxiazuoyou)
cv2.waitKey(0)
四张图分别为原图,上下翻转,左右翻转,上下左右翻转。
图像的旋转
图像旋转API
rotate(img,rotateCode)
img:是进行旋转的图像
rotateCode:ROTATE_90_CLOCKWISE 顺势针旋转90度;ROTATE_180 旋转180度;ROTATE_90_COUNTERCLOCKWISE 逆时针旋转90度
图像旋转实战代码
import cv2
import numpy as np
ww = cv2.imread('../MM/preview.jpg')
# 顺时针90
new = cv2.rotate(ww, cv2.ROTATE_90_CLOCKWISE)
# 旋转180
new1 = cv2.rotate(ww, cv2.ROTATE_180)
# 逆时针旋转90
new2 = cv2.rotate(ww, cv2.ROTATE_90_COUNTERCLOCKWISE)
cv2.imshow("ww", ww)
cv2.imshow('new', new)
cv2.imshow('new1', new1)
cv2.imshow('new2', new2)
cv2.waitKey(0)
四张图片分别为原图,顺时针旋转90度,旋转180度,逆时针旋转90度。
图像的仿射变换
仿射变换是图像旋转,缩放,平移的总称
仿射API
warpAffine(src,M,dsize,flags,mode,value)
src:对哪个图像进行仿射
M:变换矩阵
dsize:变换后的图像大小,输出尺寸
flags:与resize中的插值算法一致
mode:边界外推法标志
value:填充边界的值
平移矩阵
矩阵中每个像素有(x,y)组成
因此,变换矩阵就是2x2的矩阵;平移向量为2x1的向量,所以在平移矩阵为2x3矩阵
任务:把图片向右平移300个像素,向下平移100给像素
思考:根据要求要自己设置M变换矩阵
import cv2
import numpy as np
ww = cv2.imread('../MM/preview.jpg')
h, w, chr = ww.shape
# 自己设计M
M = np.float32([[1, 0, 300], [0, 1, 100]]) # 向右平移300 向下平移100 如果是负值就可以进行向左向上平移
new = cv2.warpAffine(ww, M, (w, h)) # (宽,高)
cv2.imshow('ww', ww)
cv2.imshow('new', new)
cv2.waitKey(0)
左图为原图,右图为进行平移后的图片,完成我们的试验任务。
变换矩阵
getRotationMatrix2D(center,angle,scale) 对图片求变换矩阵
center:旋转时的中心点
angle:旋转的角度(逆时针)
scale:缩放比例
import cv2
import numpy as np
ww = cv2.imread('../MM/preview.jpg')
h, w, chr = ww.shape
# #采用本身的参数M
# #中心点是(x,y) 旋转角度为逆时针旋转
M = cv2.getRotationMatrix2D((w / 2, h / 2), 15, 0.3)
# 如果还要改变新图像的尺寸,需要修改dsize
# new = cv2.warpAffine(ww, M, (int(w / 2), int(h / 2)))
new = cv2.warpAffine(ww, M, (w, h)) # (宽,高)
cv2.imshow('ww', ww)
cv2.imshow('new', new)
cv2.waitKey(0)
左边是原图,右边是旋转后的图像。我们发现图像通过scale缩放比例缩小了,但是整个框大小没变,想要改变框的大小就在warpAffine中修改desize的值。代码中注释了如何修改。
变换矩阵(二)
对于这种变换来说,我们不知道角度是多少。但是我们可以通过原图中点的关系,画出变换后的新图。
getAffineTransform(src[],dst[])
src[]:源中的几个坐标点
dst[]:输出后的几个坐标点
通过三个点就可以确定变换的位置
import cv2
import numpy as np
ww = cv2.imread('../MM/preview.jpg')
h, w, chr = ww.shape
src = np.float32([[400, 300], [800, 300], [400, 1000]])
dst = np.float32([[100, 400], [600, 500], [150, 1100]])
M = cv2.getAffineTransform(src, dst)
new = cv2.warpAffine(ww, M, (w, h)) # (宽,高)
cv2.imshow('ww', ww)
cv2.imshow('new', new)
cv2.waitKey(0)
左边是原图,右边是修改后的图。
透视变换
就是将左边的图变成右边的比较方正的图片(应用于各种搜题软件,类似于扫描文档)
将一种坐标系转变为另外一种坐标系。
透视变换API
warpPerspective(img,M,dsize,……)
img:修改的图像
M:变换矩阵 对于透视变换是3x3的矩阵
dsize:输出图像的大小
变换矩阵 getPerspectiveTransform(src,dst)
src:源图
dst:输出图
仿射变换第二种方式需要三个坐标点,但是透视变换需要4个坐标点(四个角)
透视变换实战代码
import cv2
import numpy as np
img = cv2.imread('../MM/123.png')
print(img.shape)
src = np.float32([[100, 1100], [2100, 1100], [0, 4000], [2500, 3900]])
dst = np.float32([[0, 0], [3200, 0], [0, 3000], [2300, 3000]])
M = cv2.getPerspectiveTransform(src, dst)
new = cv2.warpPerspective(img, M, (2300, 3000))
cv2.imshow('orgin', img)
cv2.imshow('new', new)
cv2.waitKey(0)
结果就完成了透视变换,大家可以使用代码自己尝试,每个点需要自己去尝试。