前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >图像处理: 无损地旋转图像

图像处理: 无损地旋转图像

作者头像
JNingWei
发布2018-09-27 14:43:13
2.7K0
发布2018-09-27 14:43:13
举报
文章被收录于专栏:JNing的专栏

OpenCV自带的旋转图像方法 (有损)

原图像:

这里写图片描述
这里写图片描述

如果用OpenCV自带cv2.warpAffine接口来实现图片旋转:

代码语言:javascript
复制
import cv2

# 读取原图像
img = cv2.imread("./girl.jpg")
h, w = img.shape[:2]
center = (w // 2, h // 2)

# 逆时针-90°(即顺时针90°)旋转图片
M = cv2.getRotationMatrix2D(center, -90, 1)
rotated_img = cv2.warpAffine(img, M, (w, h))

cv2.imwrite("./rotated_img.jpg", rotated_img)

处理后的结果:

这里写图片描述
这里写图片描述

可以明显看出,原图像左右两边的像素信息(黄色框内)全部丢失,损失严重:

这里写图片描述
这里写图片描述

无损旋转

我自己想到了一种无损旋转的方法,分为以下五步。

  1. 首先读取原图像: img = cv2.imread("./girl.jpg")
这里写图片描述
这里写图片描述
  1. 获取输入图像的信息,生成旋转操作所需的参数: h, w = img.shape[:2] padding = (w - h) // 2 center = (w // 2, w // 2) 其中,padding: 指定零填充的宽度; canter: 指定旋转的轴心坐标。
  2. 在原图像两边做对称的零填充,使得图片由矩形变为方形: img_padded = np.zeros(shape=(w, w, 3), dtype=np.uint8) img_padded[padding:padding+h, :, :] = img
这里写图片描述
这里写图片描述
  1. 逆时针-90°(即顺时针90°)旋转填充后的方形图片 M = cv2.getRotationMatrix2D(center, -90, 1) rotated_padded = cv2.warpAffine(img_padded, M, (w, w))
这里写图片描述
这里写图片描述
  1. 从旋转后的图片中截取出我们需要的部分,作为最终的输出图像: output = rotated_padded[:, padding:padding+h, :] cv2.imwrite("./output.jpg", output)
这里写图片描述
这里写图片描述

Code

完整源码如下:

代码语言:javascript
复制
import cv2
import numpy as np

# 读取原图像
img = cv2.imread("./girl.jpg")
cv2.imshow("", img)
cv2.waitKey(1000)

# 获取输入图像的信息,生成旋转操作所需的参数(padding: 指定零填充的宽度; canter: 指定旋转的轴心坐标)
h, w = img.shape[:2]
padding = (w - h) // 2
center = (w // 2, w // 2)

# 在原图像两边做对称的零填充,使得图片由矩形变为方形
img_padded = np.zeros(shape=(w, w, 3), dtype=np.uint8)
img_padded[padding:padding+h, :, :] = img

cv2.imshow("", img_padded)
cv2.waitKey(1000)
cv2.imwrite("./img_padded.jpg", img_padded)

# 逆时针-90°(即顺时针90°)旋转填充后的方形图片
M = cv2.getRotationMatrix2D(center, -90, 1)
rotated_padded = cv2.warpAffine(img_padded, M, (w, w))

cv2.imshow("", rotated_padded)
cv2.waitKey(1000)
cv2.imwrite("./rotated_padded.jpg", rotated_padded)

# 从旋转后的图片中截取出我们需要的部分,作为最终的输出图像
output = rotated_padded[:, padding:padding+h, :]

cv2.imshow("", output)
cv2.waitKey(1000)
cv2.imwrite("./output.jpg", output)

cv2.destroyAllWindows()
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年05月04日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • OpenCV自带的旋转图像方法 (有损)
  • 无损旋转
  • Code
相关产品与服务
图像处理
图像处理基于腾讯云深度学习等人工智能技术,提供综合性的图像优化处理服务,包括图像质量评估、图像清晰度增强、图像智能裁剪等。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档