python4次旋转图片后,多图叠加显示

文章目录

      • 想要的效果对比,原图VS显示
      • 问题
      • 要点
      • 代码

前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog

想要的效果对比,原图VS显示

python4次旋转图片后,多图叠加显示_第1张图片

问题

(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()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图:
python4次旋转图片后,多图叠加显示_第2张图片

这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。

这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图
python4次旋转图片后,多图叠加显示_第3张图片

代码

#! /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()

你可能感兴趣的:(顺手做,python,opencv,计算机视觉)