PYTHON pilImage旋转 python旋转图像

您所在的位置:网站首页 python数组转换上三角矩阵 PYTHON pilImage旋转 python旋转图像

PYTHON pilImage旋转 python旋转图像

2023-06-27 14:18| 来源: 网络整理| 查看: 265

图像旋转

PYTHON pilImage旋转 python旋转图像_数字图像处理

旋转前

PYTHON pilImage旋转 python旋转图像_坐标转换_02

旋转后

PYTHON pilImage旋转 python旋转图像_数字图像处理_03

矩阵表示

PYTHON pilImage旋转 python旋转图像_数字图像处理_04

def rotate(img, angle): H, W, C = img.shape anglePi = angle * math.pi / 180.0 cosA = math.cos(anglePi) sinA = math.sin(anglePi) out = np.zeros((H, W, C), dtype=np.uint8) # 必须是8 不然显示不出图像 for y in range(H): for x in range(W): x0 = int(x * cosA + y * sinA) y0 = int(y * cosA - x * sinA) if 0 < x0 < W and 0 < y0 < H: # 计算结果是这一范围内的x0,y0才是原始图像的坐标。 out[y0, x0] = img[y, x] return out

PYTHON pilImage旋转 python旋转图像_图像旋转_05

旋转后的图像有很多“蜂窝煤”。主要是点转换后要取整。导致原图中有些点映射到同一个点,而生成的图中有些点在原图中没有点映射到它。所以出现了很多“蜂窝煤”。

以图像的中心进行旋转

PYTHON pilImage旋转 python旋转图像_PYTHON pilImage旋转_06

在矩阵中的坐标系通常是AB和AC方向的,而数学坐标系坐标系是DE和DF方向的。

令图像表示为M×N的矩阵,对于点A而言,两坐标系中的坐标分别是(0,0)和(-N/2,M/2)

矩阵中点(x’,y’)转换为笛卡尔坐标系(x,y)的转换关系为:

PYTHON pilImage旋转 python旋转图像_坐标系转换_07

逆变换为

PYTHON pilImage旋转 python旋转图像_图像旋转_08

最后结果

1.首先将图像坐标系转换为数学坐标系。

2.使用旋转公式对坐标进行旋转。

3.将旋转后的数学坐标系转换为图像坐标系。

PYTHON pilImage旋转 python旋转图像_图像旋转_09

PYTHON pilImage旋转 python旋转图像_图像旋转_10

def rotate(img, angle): H, W, C = img.shape anglePi = angle * math.pi / 180.0 cosA = math.cos(anglePi) sinA = math.sin(anglePi) out = np.zeros((H, W, C), dtype=np.uint8) # 必须是8 不然显示不出图像 for y in range(H): for x in range(W): x0 = int(cosA * x - sinA * y - 0.5 * W * cosA + 0.5 * H * sinA + 0.5 * W) y0 = int(sinA * x + cosA * y - 0.5 * W * sinA - 0.5 * H * cosA + 0.5 * H) if 0 < x0 < W and 0 < y0 < H: # 计算结果是这一范围内的x0,y0才是原始图像的坐标。 out[y0, x0] = img[y, x] return out

PYTHON pilImage旋转 python旋转图像_数字图像处理_11

完整显示图片

图片旋转后图片可能变大

PYTHON pilImage旋转 python旋转图像_坐标转换_12

N’和M’对应于新图的宽和高

PYTHON pilImage旋转 python旋转图像_数字图像处理_13

新图像的宽和高计算公式

PYTHON pilImage旋转 python旋转图像_坐标转换_14

def rotate(img, angle): H, W, C = img.shape anglePi = angle * math.pi / 180.0 cosA = math.cos(anglePi) sinA = math.sin(anglePi) # 三角函数计算出来的结果会有小数,所以做了向上取整的操作。 # size = (W + 1, H + 1) new_height = math.ceil(H * cosA + W * sinA) new_width = math.ceil(W * cosA + H * sinA) out = np.zeros((new_height+1, new_width+1, C), dtype=np.uint8) # 必须是8 不然显示不出图像 for y in range(H): for x in range(W): x0 = int(cosA * x - sinA * y - 0.5 * W * cosA + 0.5 * H * sinA + 0.5 * new_width) y0 = int(sinA * x + cosA * y - 0.5 * W * sinA - 0.5 * H * cosA + 0.5 * new_height) # if 0 < x0


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3