QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1644|回复: 1
打印 上一主题 下一主题

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

[复制链接]
字体大小: 正常 放大
杨利霞        

5273

主题

82

听众

17万

积分

  • TA的每日心情
    开心
    2021-8-11 17:59
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

    自我介绍
    本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。

    群组2018美赛大象算法课程

    群组2018美赛护航培训课程

    群组2019年 数学中国站长建

    群组2019年数据分析师课程

    群组2018年大象老师国赛优

    跳转到指定楼层
    1#
    发表于 2020-5-10 16:27 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    % z4 H; k$ c+ N+ W
    python4次旋转图片后,多图叠加显示
    ) ?9 x# i$ i; {" v. e[color=rgba(0, 0, 0, 0.74902)]文章目录
      % V4 t1 L0 d0 q- c2 K& y3 \( J2 Z; }
      • 想要的效果对比,原图VS显示
      • 问题
      • 要点
      • 代码9 i; B' d3 v: v# W# l( c
    8 L. B; P) X* m1 a
    : o3 J: u: X& k- I, W8 S
    [color=rgba(0, 0, 0, 0.74902)]前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog
    : }( z) K# \1 c2 Z9 Z" o想要的效果对比,原图VS显示 1.jpg 1.jpg
    / L* b' m) Z- d. Y; u: ]/ ]( C. x
      i0 y# V  K8 D4 y3 [6 @5 t# t$ D+ b2 x$ f$ k, U! _
    问题
    5 w* L1 f& r: w3 I/ _# e
    + B9 C  |2 g) P9 ~0 }" o* i(1)在刚写出来时,在rotate_image()函数中没有加,im = im.convert(‘RGB’)这句话,就会出现有的图正常,但是有的图报错,无法保存,并显示下面这句话
    ) u# l# y) T1 n' ~2 X6 A- l; \3 x/ w! W, P' M+ _3 f, p; W; f
    这个问题可以在这一篇blog找到解决方法。就是im.read(url)后,再将图片转换为RGB格式(image.convert(‘RGB’))。这样就可以避免很多因图片导致的问题) x" K$ `$ L" B: p

    3 w! _3 g9 q- T3 h' k3 o: z(2)在matlabplot中,显示图的第一步是创建画布,plt.figure(),然后在画布上添加子图,最后显示整个画布的图像时,并且让子图自适应来显示。而我遇到了这个就是关于self.figure.tight_layout()的警告,见下图。4 ~9 J- I+ V( x# v; F
    $ O9 F! r0 o: L5 f: N5 n$ I0 \
    一般在使用plt创建一个画布后,程序本身会有一个自动调整子图尺寸来使用画布的情况,但是因为我是显示图片,所以这个自适应就出问题了。但是还好,只是警告,不是报错,为了方便,忽略就好…(但是我不推荐这种做法,希望有人研究一下,并把解决问题告诉我)
    ( U3 g7 c4 d0 b; _. C& r# T! ^为了方便,我直接在一开始加上下面这句,忽略掉。
    ) F* Q8 |, M6 d* y) C  Yimport warnings9 w& R& r! i% E: J: t) b( P
    warnings.filterwarnings("ignore")7 D0 Z& K# ?* o- d4 T
    8 ?9 ^, u. ^1 z; C
    要点7 p% B% c1 ~6 s* s1 \. r' s

    7 U2 \9 N) ]! D) M( u2 t1旋转图像现成的工具很多,一个是cv2提供的,主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图:
    4 e/ q! X- _/ I3 j* K0 z" S) O: x3 ^3 c5 S  \6 i' o0 ?! G

    ' K7 z- C% D) q; P1 F 3.png + j: E* q2 Y% F

    4 v7 q$ R4 |3 d# Z这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。9 |+ u* n7 W# s/ u, Z- V3 u
    ! G! P2 L3 b2 Z. t
    这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图
    7 o" M/ v: b2 F5 G3 m8 C
    5 r* U' Y! g; u% n! I. G
    3 D8 T3 y- G  s% u  [: Q/ Z 4.png 9 g7 U9 b/ L' ~
    2 O* C9 y8 m% D6 G8 i; Y: X
    代码#! /usr/bin/env python8 f/ R4 m; d# Q5 q. D" T' t
    # -*- coding: utf-8 -*-1 B+ r1 ?1 u# c& s$ z# G
    # ! python3
    - |4 j7 V7 r4 o. [$ L7 W7 v( j+ M' i+ r% x" k
    import cv2
    . w4 m  }' h# r& vimport numpy as np1 }/ @% v* r# V5 z! e& H+ P
    from PIL import Image% g% l- C- i4 a3 s
    from matplotlib import pyplot as plt% f7 r( c! [' y( D' K5 c% E! n
    import matplotlib.image as mpimg8 N9 n( o, m% h

    0 `- R0 @9 A8 l3 D& J4 X9 N* ~def rotate_image(url):
    ) m0 @/ H7 j7 a6 t+ L, E        #旋转图像,并将其保存为4种角度的图片
      |4 f, p& D4 K1 B$ R4 n; f    im = Image.open(url,"r"); h0 X8 Z) x" o7 U& ~3 w; s
        im = im.convert('RGB')  #避免有些图报错
    " p) Y  O+ i+ P  m    im.save('image_test/test_0.jpg')
    $ C7 X3 i2 ~4 N  W  T9 F    im_90 = im.transpose(Image.ROTATE_90); e# l- x4 ^& ^' r' z$ Z; |
        im_90.save('image_test/test_90.jpg'). ^0 ?" J, Y+ h
        im_180 = im.transpose(Image.ROTATE_180)
    9 O* F$ ~: O* @7 {9 X    im_180.save('image_test/test_180.jpg'); @6 L! y* L4 I, H
        im_270 = im.transpose(Image.ROTATE_270)
    3 G3 A% \; C& H$ f! W4 \  P2 q) V    im_270.save('image_test/test_270.jpg')
    2 u1 L. t* V2 O2 E2 B, x$ G  K5 t  l0 P0 s6 l
    def plt_merge_img():
    $ E) D' O2 z3 f! B$ K        #将保存的四种角度的图片,叠加在同一张画布上) k. F. g5 c4 w. E3 \2 ?) F) x! R
            #使用plt.figure()创建画布,并用add_axes()来分割区域显示图片
    3 R: s" w% B  z- S        #显示画布,并将其保存为fig_size.png4 _5 b2 U- ^( W; t" d2 H9 |
        img1 = mpimg.imread('image_test/test_0.jpg'): s9 E" I. E' F9 X& {9 k' Y
        img2 = mpimg.imread('image_test/test_90.jpg')$ E2 T/ J& a7 W0 `2 ]+ u8 e7 q% o1 ~6 o
        img3 = mpimg.imread('image_test/test_180.jpg')4 d. W. K2 m/ l, m
        img4 = mpimg.imread('image_test/test_270.jpg')
      W* ?' L/ s9 i$ L( t4 c' }$ K1 i    fig = plt.figure(figsize=(60,59),dpi=96)3 q0 ?7 e! ^3 N7 E0 K. h! p5 c) D

    ( I% c" J  u- o; n, L. P* ?#上方的横图
    " x. X- }! m2 }0 s$ F    ax1 = fig.add_axes([0.30,0.55,0.42,0.28])7 A# f8 X1 h, b3 U' J: U
        ax1.imshow(img1)
    2 q0 l8 p1 Q/ v( [# ^' U    ax1.axis('off'). v& i' D/ w. w3 U
    - p6 V: P8 x6 O- M4 b% Q
    # 右方的竖图
    1 E. n3 z4 y: o    ax4 = fig.add_axes([0.67, 0.29, 0.28, 0.42]): P* V1 y1 B: o6 T* S
        ax4.imshow(img4)
    : |1 I# |& \% c! n! n" I    ax4.axis('off')
    6 L! d% n5 [: L& W% g: |
    ' D' Z. I1 [# I8 t3 w- \+ V: R# 下方的横图( |" z) m* N1 L$ t1 ^# l
        ax3 = fig.add_axes([0.30, 0.18, 0.42, 0.28])5 ]- o; n% S8 ]$ C; K* O
        ax3.imshow(img3)
    7 P" v: N" o8 ^' B; G    ax3.axis('off')7 U2 ]$ |4 H( v$ n4 S$ M

    ! e5 Q, G" [+ U( y4 B' O: y#左方的竖图9 K" X& x' v2 H& k, ^4 ?2 p% J8 r
        ax2 = fig.add_axes([0.07, 0.29, 0.28, 0.42])
    3 {: W2 c$ U6 N6 f3 ^6 ]; x" X& n% P    ax2.imshow(img2)
    # N: u( D4 g: o+ n+ _, P    ax2.axis('off')
    & {6 G- Y3 A4 V6 D    # 保存为sig_size.png" ?" g1 S# R6 @0 ~
        plt.savefig("fig_size.png",dpi=96). H# N; t; E, S; U  \
        plt.show()
    4 z3 H& g8 K6 x
    * P! R. s! v. G0 q: Zdef main():- }- V; N$ a' R0 ]7 t
        url = 'test_1.jpg'
    % E9 s$ ?- X- U7 m    rotate_image(url)
    + X$ f8 o1 J% E$ ?    plt_merge_img()" E7 d: X* G. C) k5 ?( D; U5 e
    8 D& n3 O5 {) [7 n; l  P
    if __name__ == '__main__':) ]9 E. ~3 Z& n1 A" z
        import warnings1 l9 g3 E: ?2 j0 V( U& `3 i' n1 y
        warnings.filterwarnings("ignore")
    ; q9 b+ W4 c6 q. e    main()
    ! |0 i5 P* ^* q/ c4 Q, q5 p: @
    * z2 `7 v+ u% m7 L2 N& m# i! |————————————————
    4 x# _- q' A8 h版权声明:本文为CSDN博主「你要啥自行车」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    8 f* b% j& X0 b) M9 q原文链接:https://blog.csdn.net/weixin_42572826/article/details/106033709- G. y9 M& J, j
    : R/ r5 ]0 T( i1 S( M: h/ f7 m

    4 `- n" p: e4 \& K# a
    ( K; U  g4 r  |1 m  E2 U5 l
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    chace        

    0

    主题

    2

    听众

    259

    积分

    升级  79.5%

  • TA的每日心情

    2020-7-11 15:12
  • 签到天数: 43 天

    [LV.5]常住居民I

    网络挑战赛参赛者

    自我介绍
    学生
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-7-25 03:42 , Processed in 0.357795 second(s), 59 queries .

    回顶部