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

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

原图像:
这里写图片描述

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

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")

    这里写图片描述

  2. 获取输入图像的信息,生成旋转操作所需的参数:

    h, w = img.shape[:2]
    padding = (w - h) // 2
    center = (w // 2, w // 2)

    其中,padding: 指定零填充的宽度; canter: 指定旋转的轴心坐标。

  3. 在原图像两边做对称的零填充,使得图片由矩形变为方形:

    img_padded = np.zeros(shape=(w, w, 3), dtype=np.uint8)
    img_padded[padding:padding+h, :, :] = img

    这里写图片描述

  4. 逆时针-90°(即顺时针90°)旋转填充后的方形图片

    M = cv2.getRotationMatrix2D(center, -90, 1)
    rotated_padded = cv2.warpAffine(img_padded, M, (w, w))

    这里写图片描述

  5. 从旋转后的图片中截取出我们需要的部分,作为最终的输出图像:

    output = rotated_padded[:, padding:padding+h, :]
    
    cv2.imwrite("./output.jpg", output)

    这里写图片描述

Code

完整源码如下:

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()
在Python中使用OpenCV库进行图像旋转时,有时候会出现黑边的情况。为了避免黑边的出现,可以采用以下几种方法来处理: 1. 填充颜色:在旋转图像之前,可以先将图像的边缘进行填充,使其大小能够容纳旋转后的图像。填充的颜色可以根据需要选择,一般可以选择与图像背景相近的颜色,比如白色(255,255,255)。 2. 裁剪图像旋转图像后,可以根据需要裁剪掉黑边部分,只保留旋转后的有效图像区域。裁剪的方法可以根据具体情况选择,比如根据旋转图像的大小来裁剪或者根据预设的目标图像大小来裁剪。 3. 调整旋转中心:在使用cv.getRotationMatrix2D函数时,可以调整旋转中心的位置,使其位于图像的中心位置,这样可以减少旋转图像边缘出现黑边的可能性。 综上所述,通过填充颜色、裁剪图像或调整旋转中心的方式,可以在Python中实现图像旋转时避免黑边的问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Python+OpenCV 实现图片无损旋转90°且无黑边](https://download.csdn.net/download/weixin_38668225/12857214)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [OpenCV Python图像旋转,0-360度随机旋转,同时去除黑边](https://blog.csdn.net/qq_40037127/article/details/125206182)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值