图像的基本变换

图像的缩放

图像缩放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)

结果就完成了透视变换,大家可以使用代码自己尝试,每个点需要自己去尝试。

  • 23
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值