文章目录
- 想要的效果对比,原图VS显示
- 问题
- 要点
- 代码
想做一个将多个旋转后的图片,多图合在一起显示的小玩意,于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog
想要的效果对比,原图VS显示
问题
(1)在刚写出来时,在rotate_image()函数中没有加,im = im.convert(‘RGB’)这句话,就会出现有的图正常,但是有的图报错,无法保存,并显示下面这句话
这个问题可以在这一篇blog找到解决方法。就是im.read(url)后,再将图片转换为RGB格式(image.convert(‘RGB’))。这样就可以避免很多因图片导致的问题(2)在matlabplot中,显示图的第一步是创建画布,plt.figure(),然后在画布上添加子图,最后显示整个画布的图像时,并且让子图自适应来显示。而我遇到了这个就是关于self.figure.tight_layout()的警告,见下图。
一般在使用plt创建一个画布后,程序本身会有一个自动调整子图尺寸来使用画布的情况,但是因为我是显示图片,所以这个自适应就出问题了。但是还好,只是警告,不是报错,为了方便,忽略就好…(但是我不推荐这种做法,希望有人研究一下,并把解决问题告诉我)
为了方便,我直接在一开始加上下面这句,忽略掉。
import warnings
warnings.filterwarnings("ignore")
要点
1旋转图像现成的工具很多,一个是cv2提供的,主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图:
这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。
这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图
代码
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# ! python3
import cv2
import numpy as np
from PIL import Image
from matplotlib import pyplot as plt
import matplotlib.image as mpimg
def rotate_image(url):
#旋转图像,并将其保存为4种角度的图片
im = Image.open(url,"r")
im = im.convert('RGB') #避免有些图报错
im.save('image_test/test_0.jpg')
im_90 = im.transpose(Image.ROTATE_90)
im_90.save('image_test/test_90.jpg')
im_180 = im.transpose(Image.ROTATE_180)
im_180.save('image_test/test_180.jpg')
im_270 = im.transpose(Image.ROTATE_270)
im_270.save('image_test/test_270.jpg')
def plt_merge_img():
#将保存的四种角度的图片,叠加在同一张画布上
#使用plt.figure()创建画布,并用add_axes()来分割区域显示图片
#显示画布,并将其保存为fig_size.png
img1 = mpimg.imread('image_test/test_0.jpg')
img2 = mpimg.imread('image_test/test_90.jpg')
img3 = mpimg.imread('image_test/test_180.jpg')
img4 = mpimg.imread('image_test/test_270.jpg')
fig = plt.figure(figsize=(60,59),dpi=96)
#上方的横图
ax1 = fig.add_axes([0.30,0.55,0.42,0.28])
ax1.imshow(img1)
ax1.axis('off')
# 右方的竖图
ax4 = fig.add_axes([0.67, 0.29, 0.28, 0.42])
ax4.imshow(img4)
ax4.axis('off')
# 下方的横图
ax3 = fig.add_axes([0.30, 0.18, 0.42, 0.28])
ax3.imshow(img3)
ax3.axis('off')
#左方的竖图
ax2 = fig.add_axes([0.07, 0.29, 0.28, 0.42])
ax2.imshow(img2)
ax2.axis('off')
# 保存为sig_size.png
plt.savefig("fig_size.png",dpi=96)
plt.show()
def main():
url = 'test_1.jpg'
rotate_image(url)
plt_merge_img()
if __name__ == '__main__':
import warnings
warnings.filterwarnings("ignore")
main()