杨利霞 发表于 2020-5-10 16:27

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


python4次旋转图片后,多图叠加显示
文章目录

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


前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个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()
    ax1.imshow(img1)
    ax1.axis('off')

# 右方的竖图
    ax4 = fig.add_axes()
    ax4.imshow(img4)
    ax4.axis('off')

# 下方的横图
    ax3 = fig.add_axes()
    ax3.imshow(img3)
    ax3.axis('off')

#左方的竖图
    ax2 = fig.add_axes()
    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()

————————————————
版权声明:本文为CSDN博主「你要啥自行车」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42572826/article/details/106033709



chace 发表于 2020-5-11 12:57

感谢分享
页: [1]
查看完整版本: python4次旋转图片后,多图叠加显示