牛顿第一运动定律:物体加速度的大小跟作用力成正比,跟物体的质量成反比,且与物体质量的倒数成正比;加速度的方向跟作用力的方向相同。该定律是由艾萨克·牛顿在1687年于《自然哲学的数学原理》一书中提出的。
前言
在上期的文章(【图像篇】OpenCV图像处理(六)---图像混合VS按位运算)中,我们学习了图像混合的实际操作,其实就是图像按照不同权重的叠加,今天我们继续来学习别的图像处理知识点-图像平移VS图像旋转。
图像平移
一、图像平移简介
简单的说图像平移就是对图像像素进行操作,从而实现图像左右上下平移的功能,其实图像平移也是属于仿射变换的一种,我们接着往下看。
1.1 原始图像
1.1 代码实践
# 导入opencv包
import cv2
# 导入numpy包进行科学运算
import numpy as np
# opencv读取图片数据
img = cv2.imread('ys.jpg')
# 获取图像的高度和宽度 为后面的平移做准备
img_height = img.shape[0]
img_width = img.shape[1]
# 显示原始图像 与新图像进行对比
cv2.imshow("img", img)
# 定义变换矩阵 向左平移5个像素, 向上平移50个像素
# 注意这两个坐标的第一维度和第二维度不要改动
# 第三维才是要平移的参数
temp = np.float32([[1, 0, -5], [0, 1, -20]])
# 进行2D 仿射变换(平移变换)
new_image = cv2.warpAffine(img, temp, (img_width, img_height))
# 显示新图像
cv2.imshow("new_image", new_image)
#等待任意按键按下
cv2.waitKey(0)
cv2.destroyAllWindows()
代码解读:
在上面的代码中,主要注意这个函数:
cv2.warpAffine(img, temp, (img_width, img_height))
有三个参数,第一个是需要平移的图像,第二个是图像平移的信息(左移,上移等等),第三个就是图像原始的宽度和高度。
1.1 效果展示
图像旋转
二、图像旋转
图像旋转顾名思义就是将图像按照一个对称点进行某个度数的旋转,可以使顺时针,也可以是逆时针,下面来看看实战吧。
2.1 原始图像
2.2 代码实践
# -*- coding: utf-8 -*-
# 导入各种函数包
import numpy as np
import cv2
from math import cos,sin,radians
from matplotlib import pyplot as plt
# 读入图像数据
img = cv2.imread('TaM.jpg')
# 获取图像的高度和宽度 为后面的旋转做准备
img_height = img.shape[0]
img_width = img.shape[1]
# 获取图像中点, 作为旋转的中心点
# 此处 用int是因为单纯的/2得到的不是整数
# 因此也可以直接//2 就可以不用int来变换了
cx = int(img_width / 2)
cy = int(img_height / 2)
cv2.imshow("img", img)
# 确定旋转的中心点
center = (cx, cy)
image_dim = (img_width, img_height)
# 进行2D 仿射变换
# 围绕原点 逆时针旋转40度
M = cv2.getRotationMatrix2D(center=center,angle=40, scale=1.0)
rotated_40 = cv2.warpAffine(img, M, image_dim)
cv2.imshow("rotated_40", rotated_40)
# 围绕原点 逆时针旋转50度
M = cv2.getRotationMatrix2D(center=center,angle=50, scale=1.0)
rotated_50 = cv2.warpAffine(img, M, image_dim)
cv2.imshow("rotated_50", rotated_50)
# 围绕原点 逆时针旋转70度
M = cv2.getRotationMatrix2D(center=center,angle=70, scale=1.0)
rotated_70 = cv2.warpAffine(img, M, image_dim)
cv2.imshow("rotated_70", rotated_70)
#等待任意按键按下
cv2.waitKey(0)
cv2.destroyAllWindows()
代码解读:
在上面的代码中,我们主要关注这个函数:
cv2.getRotationMatrix2D(center=center,angle=70, scale=1.0)
注意其参数的设置,分别是中心点,角度,规模(尺寸)设置 ,这里已经在注释中写的很明白了,大家好好看看一定没问题的。
2.代码扩展
上面的的代码是否有些冗长呢?可以看到我们coding了三个几乎同样的代码去实现不同度数的图像旋转,那么我们是否可以直接采用一个函数,只是传入的参数(角度)不同,就可以实现任意度数的图像旋转呢?答案是肯定的,我们采用带有参数的函数形式就好了,一起来看看吧。
# -*- coding: utf-8 -*-
# 导入各种函数包
import numpy as np
import cv2
from math import cos,sin,radians
from matplotlib import pyplot as plt
def image_Rotation(image, rotation):
# 读入图像数据
img = cv2.imread(image)
# 获取图像的高度和宽度 为后面的旋转做准备
img_height = img.shape[0]
img_width = img.shape[1]
# 获取图像中点, 作为旋转的中心点
# 此处 用int是因为单纯的/2得到的不是整数
# 因此也可以直接//2 就可以不用int来变换了
cx = int(img_width / 2)
cy = int(img_height / 2)
cv2.imshow("img", img)
# 确定旋转的中心点
center = (cx, cy)
image_dim = (img_width, img_height)
# 进行2D 仿射变换
M = cv2.getRotationMatrix2D(center=center,angle=rotation, scale=1.0)
rotated_img = cv2.warpAffine(img, M, image_dim)
cv2.imshow("rotated_img_{}".format(rotation), rotated_img)
# #等待任意按键按下
cv2.waitKey(0)
cv2.destroyAllWindows()
if __name__ == '__main__':
# 给出image参数值:图像路径
image = './TaM.jpg'
# 给出rotation参数值:旋转度数
rotation = 60
image_Rotation(image, rotation)
print("finished")
3.扩展代码后的效果演示
2.3 效果展示
结语
今天的分享结束了,代码量不是很多,理解还是要花点时间的,图像平移和旋转都是类似的像素空间操作,大家自行体会哦,另外,大家可以发现,小编的文章在数学知识上讲的比较少,一方面是小编的时间有限,更重要的方面是图像的数学知识涉及到微积分,矩阵等知识,有时候讲了,大家可能不太好理解,因此小编就讲的比较少,后面可能多讲一点,如果大家有不懂的涉及图像的数学知识,请私聊小编,我们一起来解决,好了,我们下期再见!
编辑:玥怡居士|审核:小圈圈居士
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有