这里的放大和缩小不是指在物理空间中某一个物体的放大和缩小。二维空间坐标(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()