QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1579|回复: 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

    1 F# s+ E6 Y8 ^0 e4 U" gpython4次旋转图片后,多图叠加显示7 c# Q! ~4 l, ?; b  Z: g
    [color=rgba(0, 0, 0, 0.74902)]文章目录

      ; h; r0 P6 f  r3 g# R
      • 想要的效果对比,原图VS显示
      • 问题
      • 要点
      • 代码' @* D# D( g. X& L# P8 X; a

      R% c- R0 x. q* }: c7 Y4 {6 g4 b8 c9 G7 J! T# g* c
    [color=rgba(0, 0, 0, 0.74902)]前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog) G4 l: {9 M; \* N5 Z. r
    想要的效果对比,原图VS显示 1.jpg 1.jpg ' b2 ]$ P9 t4 F8 s0 _0 ]

    $ x9 P1 E- w! W* _# d5 Z1 _
    : ?/ t1 f9 m; u1 Z+ _问题
    ! n8 i' F2 q9 L* F. e. {9 w0 g' \; F6 z- c2 v) l$ W; d
    (1)在刚写出来时,在rotate_image()函数中没有加,im = im.convert(‘RGB’)这句话,就会出现有的图正常,但是有的图报错,无法保存,并显示下面这句话2 A. x- b* [( V. S

    ; C  a) k3 K% Q' n这个问题可以在这一篇blog找到解决方法。就是im.read(url)后,再将图片转换为RGB格式(image.convert(‘RGB’))。这样就可以避免很多因图片导致的问题
    ; z  Q* Q. q' i$ ~
    - ]5 {; x% t+ D6 N. A$ s- s; V/ l' E9 M(2)在matlabplot中,显示图的第一步是创建画布,plt.figure(),然后在画布上添加子图,最后显示整个画布的图像时,并且让子图自适应来显示。而我遇到了这个就是关于self.figure.tight_layout()的警告,见下图。
    + T$ H' {5 _$ \# [4 i, z4 n% s: j6 b
    2 T! F5 m# c; F/ g8 y一般在使用plt创建一个画布后,程序本身会有一个自动调整子图尺寸来使用画布的情况,但是因为我是显示图片,所以这个自适应就出问题了。但是还好,只是警告,不是报错,为了方便,忽略就好…(但是我不推荐这种做法,希望有人研究一下,并把解决问题告诉我); X) A+ s* @# L: w* N
    为了方便,我直接在一开始加上下面这句,忽略掉。9 }3 ?/ T- n) E3 }8 c: v2 S6 P# R
    import warnings
    6 s! g! M( p% y9 h  C9 R0 Iwarnings.filterwarnings("ignore")
    6 V$ H" {. O2 J' V& X
    + R9 X# B% E% a" Y! m要点, h' y1 G5 t! I

    9 J$ D9 L1 {* _  k2 `* e5 @1旋转图像现成的工具很多,一个是cv2提供的,主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图:
    8 n8 z0 Y+ b% c, J4 Y6 h
    ' J0 m7 ~$ I. G* E/ M
    - a( @+ O( n- Z 3.png   g9 V% J! v4 q: I; r1 B
    & [6 p& ]1 U+ ?  P& B
    这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。' p1 e) e. N7 O0 P3 o0 y
    ' b6 D9 i5 A3 l$ h: {$ V! c
    这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图
    ) a0 m4 T- l0 l7 H" {* `% O; Y; e" c7 y% K1 w2 ], ~  }

    1 ?: F" j- E# U) M4 O3 ^. G7 C 4.png
    # L* m/ j3 P0 b1 I* V# f: w/ V# T1 @! ]
    代码#! /usr/bin/env python
    1 t! }, Y* ^, O# -*- coding: utf-8 -*-# Q% U; l6 t; M3 n0 @$ q/ Z; D; Z0 F
    # ! python3% E/ p) Q2 X7 y$ y

    0 ~# t* v2 |- n: k/ o1 Gimport cv2
    % Z6 ?' ?/ P! F7 w: Y( nimport numpy as np
    ; Z" Q1 Z9 n+ `) |; Tfrom PIL import Image% K. f+ S) c1 j1 s: ]& D, q0 y3 ?
    from matplotlib import pyplot as plt
    + Q- Y4 I$ A% k3 i! m) pimport matplotlib.image as mpimg
    " L1 ^* U# ]9 d/ u
    6 j5 ^; ^, h- O# X7 Adef rotate_image(url):! @& H: d7 O% S/ U) ^1 n% v# h* K
            #旋转图像,并将其保存为4种角度的图片" H, L7 X" [/ m
        im = Image.open(url,"r")
    3 }# i$ |# I) ~3 z    im = im.convert('RGB')  #避免有些图报错
    1 q7 t. \1 P6 a' [& _3 A    im.save('image_test/test_0.jpg')
    ) ]" t  o0 r. y    im_90 = im.transpose(Image.ROTATE_90)
    , s# ^$ S. w2 F$ a) Z4 q! Q. o    im_90.save('image_test/test_90.jpg')' [, `# l6 p- G& v0 O* h7 |
        im_180 = im.transpose(Image.ROTATE_180)
    & N# [3 S% b- e" a, E7 W4 }    im_180.save('image_test/test_180.jpg')
    , O2 w+ O  ^6 c1 B7 d+ N) Y+ D    im_270 = im.transpose(Image.ROTATE_270)- \+ {2 E- E/ j
        im_270.save('image_test/test_270.jpg')( \. ?7 U( i) p7 S! Q' Q
    ) \6 R. e0 ^8 \5 a+ y0 I* b
    def plt_merge_img():% w! |! I( D! @4 E9 w  e
            #将保存的四种角度的图片,叠加在同一张画布上( B. m$ Q& m: ^2 W( W1 A  @  ~
            #使用plt.figure()创建画布,并用add_axes()来分割区域显示图片
    + R+ {: ?  Z* }. \  \        #显示画布,并将其保存为fig_size.png
    ) x8 x3 I8 }( h- a' z8 p1 h    img1 = mpimg.imread('image_test/test_0.jpg')) S+ V: W* u& D  Q
        img2 = mpimg.imread('image_test/test_90.jpg')( I6 J3 a# d% l% C) o; t
        img3 = mpimg.imread('image_test/test_180.jpg')
    9 j3 ]( e5 k& c/ {    img4 = mpimg.imread('image_test/test_270.jpg'); @: k% T. W1 }* _
        fig = plt.figure(figsize=(60,59),dpi=96)
    * f: O$ t5 r0 e& c2 y+ q4 Q  b
    % Q& S* W, @) Y" M; K#上方的横图
    8 H$ J/ P% \5 h' L/ ~9 w    ax1 = fig.add_axes([0.30,0.55,0.42,0.28])
    ; y7 c: M. u  r. `" N* p    ax1.imshow(img1)
    9 X! w0 u! j$ l1 x    ax1.axis('off')
    7 v+ u5 }# C9 L% Y6 C2 c; m' J5 c
    % p- Z1 Y% ~' P/ O# 右方的竖图
    ; p* M, _2 }/ u, H/ b9 M: U* n    ax4 = fig.add_axes([0.67, 0.29, 0.28, 0.42])
    3 g. r$ Y- G% o/ l* z& a" i5 e0 x    ax4.imshow(img4)
    9 t2 A5 j- W' m$ `( W% ~    ax4.axis('off')
    5 T# f8 y" _3 o! [7 [; A* e& Z8 o1 q& j  ?( C) }
    # 下方的横图
    5 I" h9 h! t7 [' {) e    ax3 = fig.add_axes([0.30, 0.18, 0.42, 0.28])% M& k0 p4 ]7 h
        ax3.imshow(img3)
      y& G. R' K: {. n    ax3.axis('off')
    " K3 c! b1 R* A0 f' l- n, I, t) C& g- D
    #左方的竖图+ _& y1 [2 q# C/ t8 ~( s
        ax2 = fig.add_axes([0.07, 0.29, 0.28, 0.42])
    * t3 b/ G' G# d" M* K1 V    ax2.imshow(img2)( }" m3 l- y) h" [$ L$ \  v4 |
        ax2.axis('off')
    9 C. K5 I# _; l5 O    # 保存为sig_size.png) y! E* x$ n& P% T5 B. f
        plt.savefig("fig_size.png",dpi=96)$ M% k  o5 N4 k# T9 w* |, B/ }
        plt.show()
    ) _# @4 v9 a1 ?% S
    + Q7 @, \6 ]  o) ?. o. `def main():, ^$ S7 u( v9 S8 s: j/ N; b5 T
        url = 'test_1.jpg'' X/ Z- X( f6 ?  T% Q
        rotate_image(url)+ v" A+ T% K& I6 \( Z/ Y; e
        plt_merge_img()
    ( d& E% n# h( ^* k$ n
    1 }/ i4 _" o  G: W1 }8 K1 _% vif __name__ == '__main__':  ]2 M" y0 t; e1 n0 f8 d" P2 N2 n
        import warnings" j( F! w/ J- f
        warnings.filterwarnings("ignore")
    6 o0 i$ h  q8 T9 c" _0 M    main()
    2 R; [8 K: K" X% K+ K$ M  q$ _) u( F6 e* G) m$ r2 B
    ————————————————/ w) I( v9 A- G* v. ?2 B
    版权声明:本文为CSDN博主「你要啥自行车」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。8 Q. ^7 L- A+ A7 y" ]2 u; o% d
    原文链接:https://blog.csdn.net/weixin_42572826/article/details/106033709
    . [( D1 L1 B) {; s" W& |
    " M6 y, h: X- n9 P& a" V; d) {) i0 I5 i1 F- N! b
    # A, o+ B: M+ r( \: r% F
    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-4-21 20:27 , Processed in 0.414890 second(s), 60 queries .

    回顶部