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

看不見的法師
发布: 2025-09-04 08:47:26
原创
985人浏览过

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

原图像:

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

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

代码语言:javascript代码运行次数:0运行复制
<pre class="brush:php;toolbar:false;">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)
登录后复制

处理后的结果:

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

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

佐糖
佐糖

一个AI驱动的图像处理和图片编辑平台,支持在线抠图、去水印、模糊照片变清晰、无损放大、图片裁剪、图片压缩和黑白照片上色等

佐糖 62
查看详情 佐糖
图像处理: 无损地旋转图像
无损旋转

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

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

完整源码如下:

代码语言:javascript代码运行次数:0运行复制
<pre class="brush:php;toolbar:false;">import cv2import numpy as np# 读取原图像img = cv2.imread("./girl.jpg")cv2.imshow("", img)cv2.waitKey(1000)# 获取输入图像的信息,生成旋转操作所需的参数(padding: 指定零填充的宽度; canter: 指定旋转的轴心坐标)h, w = img.shape[:2]padding = (w - h) // 2center = (w // 2, w // 2)# 在原图像两边做对称的零填充,使得图片由矩形变为方形img_padded = np.zeros(shape=(w, w, 3), dtype=np.uint8)img_padded[padding:padding+h, :, :] = imgcv2.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()
登录后复制

以上就是图像处理: 无损地旋转图像的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号