【OpenCV & Python】图像几何变换:旋转,缩放,平移

一、图像的放大和缩小原理

这里的放大和缩小不是指在物理空间中某一个物体的放大和缩小。二维空间坐标(x,y)以(0, 0)为中心在水平方向上缩放Sx倍,在垂直方向上缩放Sy倍,指的是变换后坐标位置距离(0,0)的水平距离变为原坐标离位置中心点的水平距离的Sx倍,垂直距离变为原坐标离位置中心点的垂直距离的Sy倍。

根据以上定义,(x,y)以(0,0)为中心缩放后变换后的坐标为(m,n),即(m,n) = (Sx*x, Sy*y)。显然变换后的坐标离中心点的水平距离由x|缩放为|Sx|,垂直距离由|y|缩放为|Sy|。若Sx>1,则表示在水平方向放大,就是离中心点的水平距离增大了。反之,在水平方向上缩小。同样,若Sy>1,则表示在垂直方向放大,就是离中心点的垂直距离增大了。反之,在垂直方向上缩小。若Sx = Sy,即常说的等比例缩放。例如,(-100,100)以(0,0)为中心放大两倍,则坐标变换为(-200,200)。缩放变换也可以用矩阵的形式表示:这里写图片描述
对连续区域的所有坐标进行缩放变换,图像的缩放示例图如图所示
这里写图片描述(注释:不考虑图像平移的作用!)

以上介绍的是以原点(0,0)为中心的缩放变换,那么(x,y)以任意一点(x0,y0)为中心在水平方向上缩放sx倍,在垂直方向上缩放sy倍,在缩放的后的坐标为(m,n),即(m,n) = (x0+sx(x-x0),y0+sy(y-y0)),显然缩放后的坐标位置离中心点的水平距离变为原来的sx倍,离中心点的垂直距离变为原来的sy倍。可以将该变换过程理解为先将原点平移到中心点,再以原点为中心进行缩放,然后再回到坐标原点,用矩阵形式可以表示为:这里写图片描述
举例:(9,9)以(5,3)为中心同比例缩小2倍。(9,9)离(5,3)的水平距离为4,垂直距离为6,同比例缩小2倍,则变换后的坐标位置离(5,3)的水平距离为2,垂直距离应为3,即变换后的坐标为(7,6),用矩阵表示该计算过程为:
这里写图片描述

三、代码

#coding=utf-8
#date:  2018/1/7 0007

import numpy as np
import cv2
import sys
import math

#读取原始的图像
image = cv2.imread('src.jpg', 1)

#原图的高、宽 以及通道数
rows, cols, channel = image.shape

#仿射变换矩阵,将图像缩小两倍
affineShrink = np.array([[0.5, 0, 0], [0, 0.5, 0]], np.float32)
shrinkTwoTimes = cv2.warpAffine(image, affineShrink, (cols/2, rows/2), borderValue=125)

#先缩小2倍再平移
affineShrinkTranslation = np.array([[0.5, 0, cols/4], [0, 0.5, rows/4]], np.float32)
shrinkTwoTimesTranslation = cv2.warpAffine(image, affineShrinkTranslation, (cols, rows), borderValue=125)

#在shrinkTwoTimesTranslation的基础上 绕图像的中心旋转
affineShrinkTranslationRotation = cv2.getRotationMatrix2D((cols/2, rows/2), 30, 1)
ShrinkTranslationRotation = cv2.warpAffine(shrinkTwoTimesTranslation, affineShrinkTranslationRotation, (cols, rows), borderValue=125)

cv2.imshow('image', image)
cv2.imshow('shrinkTwoTimes', shrinkTwoTimes)
cv2.imwrite('FKJ1.jpg',shrinkTwoTimes )
cv2.imshow('shrinkTwoTimesTranslation', shrinkTwoTimesTranslation)
cv2.imshow('ShrinkTranslationRotation', ShrinkTranslationRotation)
cv2.waitKey(0)
cv2.destroyAllWindows()

图片运行结果

  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值