图像旋转后传

根据图像旋转,复习下图像变换基础知识。

有兴趣的同学可以通过下面翻译为c++版本。

几何变换

几何变换可以看成图像中物体(或像素)空间位置改变,或者说是像素的移动。

几何运算需要空间变换和灰度级差值两个步骤的算法,像素通过变换映射到新的坐标位置,新的位置可能是在几个像素之间,即不一定为整数坐标。这时就需要灰度级差值将映射的新坐标匹配到输出像素之间。最简单的插值方法是最近邻插值,就是令输出像素的灰度值等于映射最近的位置像素,该方法可能会产生锯齿。这种方法也叫零阶插值,相应比较复杂的还有一阶和高阶插值。

插值算法感觉只要了解就可以了,图像处理中比较需要理解的还是空间变换。

空间变换

空间变换对应矩阵的仿射变换。一个坐标通过函数变换的新的坐标位置:

所以在程序中我们可以使用一个2*3的数组结构来存储变换矩阵:

以最简单的平移变换为例,平移(b1,b2)坐标可以表示为:

因此,平移变换的变换矩阵及逆矩阵记为:

缩放变换:将图像横坐标放大(或缩小)sx倍,纵坐标放大(或缩小)sy倍,变换矩阵及逆矩阵为:

选择变换:图像绕原点逆时针旋转a角,其变换矩阵及逆矩阵(顺时针选择)为:

以上部分摘自:https://blog.csdn.net/xiaowei_cqu/article/details/7616044  

主要是介绍了下M的含义,为之下的内容做准备.

import cv2
from math import *
import numpy as np

img = cv2.imread("1.jpeg")


# 放大图像
# fx = 1.6
# fy = 1.2
# enlarge = cv2.resize(img, (0, 0), fx=fx, fy=fy, interpolation=cv2.INTER_CUBIC)
# res = cv2.resize(img,None,fx=2, fy=2, interpolation = cv2.INTER_CUBIC)
height, width = img.shape[:2]
print(height,width)
# 缩小图像
size = (int(width * 0.3), int(height * 0.3))
img = cv2.resize(img, size, interpolation=cv2.INTER_AREA)

height, width = img.shape[:2]
print(height,width)
degree = 45
# 旋转后的尺寸
heightNew = int(width * fabs(sin(radians(degree))) + height * fabs(cos(radians(degree))))  # 这个公式参考之前内容
widthNew = int(height * fabs(sin(radians(degree))) + width * fabs(cos(radians(degree))))
print(heightNew,widthNew)
#第一个参数旋转中心,第二个参数旋转角度,第三个参数:缩放比例

matRotation = cv2.getRotationMatrix2D((width / 2, height / 2), degree, 1)
print(matRotation)
matRotation[0, 2] += (widthNew - width) / 2  # 因为旋转之后,坐标系原点是新图像的左上角,所以需要根据原图做转化
matRotation[1, 2] += (heightNew - height) / 2

#第三个参数:变换后的图像大小
imgRotation = cv2.warpAffine(img, matRotation, (widthNew, heightNew), borderValue=(255, 255, 255))

cv2.imshow("img", img)
cv2.imshow("imgRotation", imgRotation)
cv2.waitKey(0)

结果:

原始尺寸:1600 1066
缩放尺寸:480 319
旋转尺寸:564 564
旋转矩阵:[[   0.70710678    0.70710678 -122.98915908]
 [  -0.70710678    0.70710678  183.07790411]]

测试图片:你好,李焕英 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

DLANDML

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

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

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

打赏作者

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

抵扣说明:

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

余额充值