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




图像缩放

cv2.resize(src, dsize, dst=None, fx=None, fy=None, interpolation=None)

参数表示意义
src源图像
dsize需要调整到的尺寸
dst目标图像
fx沿x轴的缩放比例
fy沿y轴的缩放比例
interpolation插值方式
插值方法作用
INTER_NEAREST最近邻插值
INTER_LINEAR双线性插值(默认设置)
INTER_AREA使用像素区域关系进行重采样
INTER_CUBIC4x4像素邻域的双三次插值
INTER_LANCZOS48x8像素邻域的Lanczos插值
import cv2 as cv 
import numpy as np 


def cv_show(name, img):
    '''
     显示图像
    '''
    cv.imshow(name, img)
    cv.waitKey()
    cv.destroyAllWindows()

img = cv.imread("pictures/cat.jpg")
cv_show("img", img)
img_resize = cv.resize(img, (200, 200), interpolation=cv.INTER_LINEAR)
cv_show("img_resize", img_resize)

在这里插入图片描述
在这里插入图片描述


图像平移

cv2.warpAffine(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None)

参数表示意义
src源图像
M变换矩阵
dsize需要调整到的尺寸
dst目标图像
flag插值方式的组合
borderMode边界像素模式
borderValue边界填充值(默认为0)
import cv2 as cv
import numpy as np


def cv_show(name, img):
    '''
     显示图像
    '''
    cv.imshow(name, img)
    cv.waitKey()
    cv.destroyAllWindows()


img = cv.imread("pictures/cat.jpg")
cv_show("img", img)
(height, width, _) = img.shape
# 变换矩阵
# 1,0表示水平方向上  20表示平移20
# 0,1表示竖直方向上  50表示平移50
mat_translation = np.float32([[1, 0, 20], [0, 1, 50]])
img_warpAffine = cv.warpAffine(img, mat_translation, (width, height))
cv_show("img_warpAffine", img_warpAffine)

在这里插入图片描述
在这里插入图片描述


图像镜像

cv2.flip(src, flipCode, dst=None)

参数表示意义
src源图像
flipCode翻转模式
dst目标图像
翻转模式效果
1水平镜像
0垂直镜像
-1水平垂直同时进行(对角镜像)
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt


def cv_show(name, img):
    '''
     显示图像
    '''
    cv.imshow(name, img)
    cv.waitKey()
    cv.destroyAllWindows()


img = cv.imread("pictures/cat.jpg", 0)
# 水平镜像
img_flip_hori = cv.flip(img, 1)
# 垂直镜像
img_flip_verti = cv.flip(img, 0)
# 对角镜像
img_flip_diag = cv.flip(img, -1)
plt.subplot(2, 2, 1), plt.imshow(img, 'gray'), plt.title("img"), plt.xticks(
    []), plt.yticks([])
plt.subplot(2, 2, 2), plt.imshow(
    img_flip_hori,
    'gray'), plt.title("img_flip_hori"), plt.xticks([]), plt.yticks([])
plt.subplot(2, 2, 3), plt.imshow(
    img_flip_verti,
    'gray'), plt.title("img_flip_verti"), plt.xticks([]), plt.yticks([])
plt.subplot(2, 2, 4), plt.imshow(
    img_flip_diag,
    'gray'), plt.title("img_flip_diag"), plt.xticks([]), plt.yticks([])
plt.show()

在这里插入图片描述


图像旋转

图像旋转也是用的:cv2.warpAffine(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None)

只不过旋转需要使用:cv2.getRotationMatrix2D(center, angle, scale)函数来生成旋转变换矩阵

cv2.getRotationMatrix2D(center, angle, scale)

参数表示意义
center中心点的位置
angle逆时针旋转度数
scale缩放比例(1是等比例缩放,2是放大一倍,以此类推)
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt


def cv_show(name, img):
    '''
     显示图像
    '''
    cv.imshow(name, img)
    cv.waitKey()
    cv.destroyAllWindows()


img = cv.imread("pictures/cat.jpg")
cv_show("img", img)
(height, width, _) = img.shape
center = (width // 2, height // 2)
M = cv.getRotationMatrix2D(center, 45, 1.0)
img_rotate = cv.warpAffine(img, M, (width, height))
cv_show("img_rotate", img_rotate)

在这里插入图片描述
在这里插入图片描述


图像透视变换

透视变换函数:
cv2.warpPerspective(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None)
cv2.warpPerspective()用于解决cv2.warpAffine()不能处理视场和图像不平行的问题。

参数表示意义
src源图像
M变换矩阵
dsize需要调整到的尺寸
dst目标图像
flag插值方式的组合
borderMode边界像素模式
borderValue边界填充值(默认为0)

使用warpPerspective之前应该先得到转换矩阵,而透视变换的转换矩阵由cv2.getPerspectiveTransform(src, dst, solveMethod=None)函数得到

参数表示意义
src输入图像的四边形的顶点坐标
dst输出图像对应的四边形的顶点坐标
solveMethodDecompTypes
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt


def cv_show(name, img):
    '''
     显示图像
    '''
    cv.imshow(name, img)
    cv.waitKey()
    cv.destroyAllWindows()


img = cv.imread("pictures/words.png")
cv_show("img", img)
(height, width, _) = img.shape
# 定义对应的点
points1 = np.float32([[75, 55], [340, 55], [33, 435], [400, 433]])
points2 = np.float32([[0, 0], [360, 0], [0, 420], [360, 420]])
# 得到转换矩阵
mat_translation = cv.getPerspectiveTransform(points1, points2)
# 透视变换
img_perspctive = cv.warpPerspective(img, mat_translation, (290, 360))
cv_show("img_perspctive", img_perspctive)

在这里插入图片描述
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值