图像旋转python和numpy实现

给定一张图片,如何在不使用PIL、OpenCV这些库的情况下,单独使用Numpy库实现图片旋转。

“talk is easy, show me the code!”

常见旋转有:上下翻转、左右翻转、旋转180度、逆时针旋转90度、顺时针旋转90度。

(1)上下翻转

图片沿着图片中心的水平线,上下翻转,第一行调换到倒数第一行,第二行调换到倒数第二行,以此类推。

python实现:

# 上下翻转 = 颠倒各个行的顺序

arr_up = arr[::-1, ...] # 这一行等价于arr[::-1]

(2)左右翻转

图片沿着图片中心的垂直线,左右翻转,第一列调换到倒数第一列,第二列调换到倒数第二列,以此类推。

python实现:

# 左右翻转 = 颠倒各个列的顺序

arr_lr = arr[:, ::-1]

(3)旋转180度

以图片中心点为原点,顺时针或者逆时旋转180度,左上角元素换到右下角,左下角元素换到右上角。

python实现:

# 旋转180度 = 先上下翻转再左右翻转,或者先左右翻转再上下翻转

arr_180 = arr[::-1, ...][:, ::-1]

(4)逆时针旋转90度

以图片中心为旋转原点,第一行换到第一列,最后一行换到最后一列。

python实现:

# 逆时针旋转90度 = 等价于矩阵的转置 + 上下翻转

arr_n90 = np.transpose(arr, axes=(1, 0, 2))[::-1, ...]

(5)顺时针旋转90度

以图片中心为旋转中心,第一列换到最后一列,最后一列换到第一列。

python实现:

# 顺时针旋转90 = 等价于先旋转180度,再逆时针旋转90度

arr_s90 = np.transpose(arr[::-1, ...][:, ::-1], axes=(1, 0, 2))[::-1, ...]

以汽车为例,各个旋转的效果如下:

如果需要完整python代码,可以添加微信公众号:kelly学技术,回复:图像旋转

--over --

### 实现图像旋转的最近邻插值法 为了实现图像旋转的最近邻插值法,可以按照以下方法编写 Python NumPy 的代码: #### 准备工作 首先导入必要的库: ```python import numpy as np import cv2 ``` 定义函数 `nearest_neighbor_interpolation` 来执行最近邻插值操作。该算法遍历目标图像中的每一个像素位置 `(i, j)` 并找到源图像中最接近的位置 `(x_prime, y_prime)`。 对于任意角度 θ 的逆时针旋转矩阵 R 可表示为: \[R=\begin{bmatrix}\cos(\theta)&-\sin(\theta)\\\sin(\theta)&\cos(\theta)\end{bmatrix}.\] 设原始坐标系下某一点 P(x,y),则其经过旋转变换后的对应点 Q(x′,y′)=P*R。 考虑到实际应用中坐标的离散性整数特性,需要取最靠近变换后浮点型坐标的整数值作为最终映射到原图上的索引。 ```python def rotate_image_nearest_neighbor(image, angle_degrees): h, w = image.shape[:2] # 计算中心点用于平移回原位 center_x, center_y = (w - 1) / 2.0, (h - 1) / 2.0 # 构建仿射变换矩阵(先移动至零点再做旋转) theta = np.radians(angle_degrees) c, s = np.cos(theta), np.sin(theta) M_translation_to_origin = np.float32([ [1, 0, -center_x], [0, 1, -center_y], [0, 0, 1]]) M_rotation = np.float32([[c, -s, 0], [s, c, 0], [0, 0, 1]]) M_translation_back = np.float32([ [1, 0, center_x], [0, 1, center_y], [0, 0, 1]]) M_combined = M_translation_back @ M_rotation @ M_translation_to_origin # 创建一个新的空白画布放置旋转后的图片 rotated_canvas = np.zeros_like(image) for i in range(h): # 遍历新图像每一行 for j in range(w): # 遍历新图像每一列 # 将当前像素转换成齐次坐标形式 pixel_coords_homogeneous = np.array([j,i,1]) # 应用组合变换得到旧图像相应位置 old_pixel_coords_homogeneous = M_combined @ pixel_coords_homogeneous # 转换成非齐次坐标并四舍五入获得近似整数坐标 x_prime, y_prime = map(int,map(round,[old_pixel_coords_homogeneous[0]/old_pixel_coords_homogeneous[2], old_pixel_coords_homogeneous[1]/old_pixel_coords_homogeneous[2]])) # 检查是否超出边界条件 if 0 <= x_prime < w and 0 <= y_prime < h: rotated_canvas[i,j] = image[y_prime,x_prime] return rotated_canvas ``` 此段程序实现了基于给定的角度参数对输入灰度级或彩色图像进行顺时针方向的旋转处理,并利用了最近邻插值技术填充新的像素值[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值