QQ登录

只需要一步,快速开始

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

    , z1 Q4 Q; l1 mpython4次旋转图片后,多图叠加显示
    ) z  Z' }% q" q7 O. `. C0 p3 @) n$ J[color=rgba(0, 0, 0, 0.74902)]文章目录

      ; _+ b8 ]0 b! {  ~/ S4 S9 P
      • 想要的效果对比,原图VS显示
      • 问题
      • 要点
      • 代码
        4 U( P- P  ^$ ~) S% P5 _$ I% u, s
    3 X8 ]% R) }$ J+ d* c0 ^3 B; K
    + X' D; |  w7 J% O5 i
    [color=rgba(0, 0, 0, 0.74902)]前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog
    8 r, P) y4 T! @想要的效果对比,原图VS显示 1.jpg 1.jpg
    8 x4 P- v0 V: h: O( h8 ^+ L8 q$ }# Q, w1 m+ o
    " u  x2 B: s+ t/ N# b
    问题
    8 ?( u6 U! X* Y+ P% _9 |* S9 n8 l' w5 V- Q; i6 \0 q
    (1)在刚写出来时,在rotate_image()函数中没有加,im = im.convert(‘RGB’)这句话,就会出现有的图正常,但是有的图报错,无法保存,并显示下面这句话
    4 m0 \# U5 h" j( n
    * }* X# Z6 s/ _1 A0 z. b这个问题可以在这一篇blog找到解决方法。就是im.read(url)后,再将图片转换为RGB格式(image.convert(‘RGB’))。这样就可以避免很多因图片导致的问题! C4 Z# Q7 U3 E
    4 f! R3 b1 v! U. S
    (2)在matlabplot中,显示图的第一步是创建画布,plt.figure(),然后在画布上添加子图,最后显示整个画布的图像时,并且让子图自适应来显示。而我遇到了这个就是关于self.figure.tight_layout()的警告,见下图。2 z; h8 Q9 I/ U4 t% o

    ) d) j' x6 T2 X+ i& S一般在使用plt创建一个画布后,程序本身会有一个自动调整子图尺寸来使用画布的情况,但是因为我是显示图片,所以这个自适应就出问题了。但是还好,只是警告,不是报错,为了方便,忽略就好…(但是我不推荐这种做法,希望有人研究一下,并把解决问题告诉我)
    4 V8 c( p+ J) P( O+ c为了方便,我直接在一开始加上下面这句,忽略掉。
      b) N1 F- o; |" c+ t' Mimport warnings
    1 v- B: w0 @+ _( zwarnings.filterwarnings("ignore")/ _$ F" k) w3 U
    8 B4 n' v: F5 b7 S
    要点# R) e' l/ Q# p; N( }3 M1 {
    ' c: H4 ?5 {/ \3 `4 P. g; `# h
    1旋转图像现成的工具很多,一个是cv2提供的,主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图:" ]0 ~+ S( p4 J( o& `

    . |  J" _9 f3 _! x
    " ~1 p3 e4 w  z+ ~+ B, X 3.png 3 d1 v  u, W- i1 g+ `! ]& a# e
      G0 E) F/ Z, ~
    这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。
    , Z* s, f1 C3 C) Y7 T- v. S* j2 @% D% A; V. ?
    这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图& F) c$ F* ^% v- q$ r5 W5 @/ L
    3 }1 Y$ a$ Y4 [/ B
    & S( {& I4 k4 y. }4 I  n( [5 x
    4.png 3 Y* ]: M, S% O& o0 ^/ Z! N

    % S% f0 T$ c, b代码#! /usr/bin/env python8 |$ i4 G/ i! I
    # -*- coding: utf-8 -*-, v0 Q$ t4 }% V. B# d; o9 M
    # ! python3
    , ~7 S% A2 ]# S+ p0 G8 ~! @
    - s  u, I; v7 f/ h2 Fimport cv2/ k% Z, F) O; S& |
    import numpy as np; d. j7 Y! Z7 K! [+ }9 X
    from PIL import Image
    + b; ^' N0 _- Q: c+ ]8 S5 tfrom matplotlib import pyplot as plt
    : A8 C3 p3 i' \  s4 Y9 Qimport matplotlib.image as mpimg
    9 l4 o" h; }, }2 M  w7 f/ j, D, L
    def rotate_image(url):
    0 G! _4 S2 I7 Q4 p3 i        #旋转图像,并将其保存为4种角度的图片! {# U7 k/ i5 ]: V/ ?1 H2 T: ?
        im = Image.open(url,"r")
    $ w$ r+ a% N' Z    im = im.convert('RGB')  #避免有些图报错
    3 R# [* m8 }, w; L$ o  T$ W    im.save('image_test/test_0.jpg')
    3 X/ L8 ~( x! n( v& `    im_90 = im.transpose(Image.ROTATE_90)
    & i& ]' ^3 Q+ J( W    im_90.save('image_test/test_90.jpg')" d4 Z8 @2 u& Y+ d5 J5 ?
        im_180 = im.transpose(Image.ROTATE_180)4 E* e) u5 x4 }/ b# n
        im_180.save('image_test/test_180.jpg')
    , |# X: X# O, n& s$ }) k- a. O    im_270 = im.transpose(Image.ROTATE_270). j; e) C; t  J, a% C+ W
        im_270.save('image_test/test_270.jpg')
    3 h* a8 h. P, H  O/ u+ _5 F, z/ H# G3 }4 A
    def plt_merge_img():- X- k& T) v1 D& U2 Z
            #将保存的四种角度的图片,叠加在同一张画布上
    - `! E* s6 i. W# `& S/ z* d! }4 D        #使用plt.figure()创建画布,并用add_axes()来分割区域显示图片
    / X. t* @' t- b7 I, \+ K9 Z        #显示画布,并将其保存为fig_size.png$ D; q7 ]4 e% Z0 v0 D
        img1 = mpimg.imread('image_test/test_0.jpg')) D7 [- X& P5 C% S! X
        img2 = mpimg.imread('image_test/test_90.jpg'). @( x  R" W: a2 ^
        img3 = mpimg.imread('image_test/test_180.jpg')& K2 [9 f& k* i* J: I: g
        img4 = mpimg.imread('image_test/test_270.jpg')% [# z) G4 m! i+ A
        fig = plt.figure(figsize=(60,59),dpi=96)
    . {  W/ g+ U; {! k9 I# Q& f% {; f8 e! r0 E" a" ~- s0 _4 {0 A! y0 a
    #上方的横图4 I. ]; _3 j3 n/ ?% j' w4 q3 A
        ax1 = fig.add_axes([0.30,0.55,0.42,0.28])7 h2 @' T; ^- r1 @' g
        ax1.imshow(img1)% ]& R, D2 N$ Y+ _
        ax1.axis('off')! T) n+ i6 v7 l# @: a* E6 X& W8 o2 o
    % i$ `0 g3 Y. {( L& }5 W6 Z% l) s
    # 右方的竖图
    4 b. m1 s& k7 @  r+ \. u/ n    ax4 = fig.add_axes([0.67, 0.29, 0.28, 0.42])8 y, s- T, H& y( D. r4 E6 h/ W$ @
        ax4.imshow(img4)) [: }# x; k/ b; i2 n
        ax4.axis('off')- A7 `+ [3 S7 I  B) b
    3 \0 i) G7 e5 H1 Z5 ]. h$ p
    # 下方的横图
    # h  i9 D+ b  V( j/ m9 y8 ]    ax3 = fig.add_axes([0.30, 0.18, 0.42, 0.28])
    & V7 r1 ?  M" t7 H    ax3.imshow(img3)  i( v) r' B3 v- H3 K  W$ ]
        ax3.axis('off')
    - p5 \" N* M+ o. j, t, v: |! L0 |% D8 X8 @
    #左方的竖图
      ~: A6 o3 ~+ J    ax2 = fig.add_axes([0.07, 0.29, 0.28, 0.42])6 R' ]+ V0 Y4 c, s9 @" ?5 W; X  B$ d
        ax2.imshow(img2)
    3 E# T' B/ D. J; H& W' T) T    ax2.axis('off')/ E3 O& V- Y) \9 v6 t6 F1 x6 x) g( t
        # 保存为sig_size.png
    8 j  Z  s3 }1 @7 c  F8 U2 t0 x    plt.savefig("fig_size.png",dpi=96)% k+ E" j" F: a. N
        plt.show()
    2 r/ |* M; _6 s1 V* ?9 X7 N4 _
    def main():
    ! {9 A5 T9 k0 U4 b+ c* d    url = 'test_1.jpg'+ N0 t$ p. J3 H2 C
        rotate_image(url)/ r1 r$ A3 P$ h% m. V* C+ r' J
        plt_merge_img(); q3 @8 O3 f+ ], G3 A; ]% V% I

    8 U' o, @2 @9 n0 d: I" i* qif __name__ == '__main__':
    % P* W# U9 {1 N9 z4 [    import warnings/ w8 C1 b8 v' n$ Q/ I4 U1 |
        warnings.filterwarnings("ignore")$ Y5 ?- B1 x% J2 M1 A
        main()4 \/ @. p9 X3 }" }7 x4 {% H
    ! W: {) Q0 o7 v+ b
    ————————————————4 J7 G" {& e3 G2 e& g/ [7 f( h3 B7 j
    版权声明:本文为CSDN博主「你要啥自行车」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。4 _- o% i: T- P9 i/ h3 v2 x
    原文链接:https://blog.csdn.net/weixin_42572826/article/details/1060337095 G& b8 w0 E. w% e: |

    ( V* L+ s) g# g5 H4 W. F0 {! u* y7 V& @- l# [7 U
    & b% ~! i4 G. i/ c+ ~8 m3 h
    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-9-8 12:33 , Processed in 0.833136 second(s), 59 queries .

    回顶部