数字图像处理之图像几何变换

图像的几何变换包括以下几个方面:
在这里插入图片描述
导入库

import numpy as np
import matplotlib.pyplot as plt
import cv2 as cv

显示图片函数

def show(img):
    if img.ndim == 2:
        plt.imshow(img,cmap='gray')
    else:
        plt.imshow(cv.cvtColor(img,cv.COLOR_RGB2BGR))
    plt.show()

图片的剪裁、放大和缩小

#图片剪裁
img = cv.imread('C:\PerfLogs\pc4.jpg')
img_pg = img[1250:1750,300:1000,:]
show(img_pg)
#opencv中自带的resize函数
img2 = cv.resize(img,(500,400))
show(img2)

原图:
在这里插入图片描述
剪裁过后:
在这里插入图片描述
调整大小:
在这里插入图片描述

平移变换

在这里插入图片描述
平移矩阵:在这里插入图片描述

#平移变换
M = np.array([
    [1,0,100],
    [0,1,50]
],dtype=np.float32)#平移矩阵
img2 = cv.warpAffine(img,M,(1333,2003))#原图、偏移矩阵、变换后的图片大小
show(img2)

在这里插入图片描述

错切变换

在这里插入图片描述
其实错切变换和平移变换的公式是一样的,只不过矩阵的参数不同,可以根据平移变换来考虑错切变换。

#水平错切变换
M = np.array([
    [1,0.2,0],
    [0,1,0]
],dtype=np.float32)
img3 = cv.warpAffine(img,M,(2333,2203))
show(img3)
#垂直错切变换
M = np.array([
    [1,0,0],
    [0.3,1,0]
],dtype=np.float32)
img3 = cv.warpAffine(img,M,(2333,2203))
show(img3)

水平错切:
在这里插入图片描述
垂直错切:
在这里插入图片描述

镜像变换

在这里插入图片描述
考虑对称性

#水平镜像变换
Mx = np.array([
    [-1,0,930],
    [0,1,0]
],dtype=np.float32)
img4 = cv.warpAffine(img,Mx,(3333,2203))
show(img4)
#垂直镜像变换
Mx = np.array([
    [1,0,0],
    [0,-1,1200]
],dtype=np.float32)
img4 = cv.warpAffine(img,Mx,(1333,2203))
show(img4)

上面的代码是自己写的变换矩阵,然后实现的镜像变换。其实opencv中是有自带的库函数进行镜像变换的。但是实际使用的时候,可能需要根据不同的对称线进行镜像变换,所以学会变换矩阵的做法也是很必要的。

#镜像变换函数
img4 = cv.flip(img ,1)#水平镜像变换
img5 = cv.flip(img ,0)#垂直镜像变换
img6 = cv.flip(img ,-1)#中心镜像变换
show(np.hstack([img4,img5,img6]))

在这里插入图片描述

旋转变换

在这里插入图片描述
公式推导:
在这里插入图片描述

#旋转变换
beta = np.pi / 4.0
M = np.array([
    [np.cos(beta),np.sin(beta),0],
    [-np.sin(beta),np.cos(beta),0]
],dtype=np.float32)
img5 = cv.warpAffine(img,M,(4333,2203))
show(img5)

opencv自带的库函数进行旋转变换-利用opencv自带的库函数求出变换矩阵

#opencv函数进行旋转变换
h,w,c = img.shape
M2 = cv.getRotationMatrix2D((w//2,h//2),45,1)#中心点、角度、放大还是缩小
img5 = cv.warpAffine(img,M2,(1333,1203))

在这里插入图片描述
opencv自带的库函数直接实现旋转变换,但是只能是特殊角度的旋转,例如90°,180°。

img6 = cv.rotate(img,cv.ROTATE_90_CLOCKWISE)
show(img6)

在这里插入图片描述

透视变换

所谓的透视变换就是将图片偏向正视角的部分朝向正视角。如下所示:
在这里插入图片描述

#透视变换
img = cv.imread('C:\PerfLogs\pp.jpg')
src = np.array([
    [210,50],
    [610,270],
    [650,470],
    [150,450]
],dtype=np.float32)#想透视变换的部分,在原图中的四角坐标,左上-右上-右下-左下
dst = np.array([
    [150,50],
    [650,50],
    [650,470],
    [150,470]
],dtype=np.float32)#透视变换之后的部分,在生成的图片中的四角坐标,左上-右上-右下-左下
M = cv.getPerspectiveTransform(src,dst)
img2 = cv.warpPerspective(img,M,(1500,1500))
show(img2)
  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

starlet_kiss

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值