QQ登录

只需要一步,快速开始

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

    5 n' t0 \% u! @4 n: n: {' wpython4次旋转图片后,多图叠加显示4 w# m/ p# T* Q( r" s5 ?
    [color=rgba(0, 0, 0, 0.74902)]文章目录
      " l7 n4 s6 F4 U, l, Y
      • 想要的效果对比,原图VS显示
      • 问题
      • 要点
      • 代码8 I/ ~( t2 N- F2 r1 x

    7 l1 K1 G  v; ~' |  r; g: }% z% ?6 ~, e) p1 d/ A) m9 N
    [color=rgba(0, 0, 0, 0.74902)]前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog; g# A% |0 `' K1 g+ u% h" D3 T) E
    想要的效果对比,原图VS显示 1.jpg 1.jpg ) A5 r$ s+ E; v( w: o! L
    & |1 K% t! Q3 K0 U2 K

    0 O! {$ U  C  M问题
    % e( e. o$ m+ _7 Q- y
    : d+ Q* d8 U. k' J# d(1)在刚写出来时,在rotate_image()函数中没有加,im = im.convert(‘RGB’)这句话,就会出现有的图正常,但是有的图报错,无法保存,并显示下面这句话
    0 V+ h5 G4 X0 ?* b! B: F; N) Z( G8 F: t1 E2 c1 B8 |1 i
    这个问题可以在这一篇blog找到解决方法。就是im.read(url)后,再将图片转换为RGB格式(image.convert(‘RGB’))。这样就可以避免很多因图片导致的问题- _* p- v2 d( v% V  u* T. l

    ) V1 x* x5 j  J: u5 n(2)在matlabplot中,显示图的第一步是创建画布,plt.figure(),然后在画布上添加子图,最后显示整个画布的图像时,并且让子图自适应来显示。而我遇到了这个就是关于self.figure.tight_layout()的警告,见下图。
    ' u, E8 `' [! u5 n& X* S% O7 M" [% b' z
    一般在使用plt创建一个画布后,程序本身会有一个自动调整子图尺寸来使用画布的情况,但是因为我是显示图片,所以这个自适应就出问题了。但是还好,只是警告,不是报错,为了方便,忽略就好…(但是我不推荐这种做法,希望有人研究一下,并把解决问题告诉我)& O+ O* ?* j/ z; K" P
    为了方便,我直接在一开始加上下面这句,忽略掉。
    9 Z$ c; u2 j, N+ B+ M8 N" \import warnings# {' }  y$ O1 Q& d4 d& x* x2 j
    warnings.filterwarnings("ignore")
    - C6 O5 B) ?) i0 t) y' o- c
    ! a# g; e8 s9 m3 o要点
    + C) q( n- l1 |/ [" [( E
    6 h4 `/ z1 ~4 y& q" A2 s: W+ C1旋转图像现成的工具很多,一个是cv2提供的,主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图:
    - S2 D$ ^+ S+ D: ?' }% k) s
    $ F; c, C) Q3 u- P( R- j+ w) Y9 d1 z; ~6 K! h% G9 E" I4 _5 c
    3.png
    ; `. Q" A. o: l2 g& z, j
    1 b, @5 g, j( A7 d; @4 F: f这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。
    5 E# }) p8 T% Q1 }0 k: D# M( B; y* g( q! ]
    这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图
    : o: H' e) |+ O/ [1 Y
    , E% t6 f& T. J/ a5 a/ G, W& c
    * T1 O9 A' \, S, k) m 4.png ; `$ x5 U9 c5 N4 P" A9 R
    3 ~0 _0 K# A$ Y
    代码#! /usr/bin/env python; D7 N9 x# x9 q8 s
    # -*- coding: utf-8 -*-
    7 P) L4 ]- W2 U/ i  f2 |# ! python3
    0 r+ Z* j8 }' \: Q
    ( R3 g% d+ C0 I3 mimport cv2) c( f2 u9 M8 _$ ]
    import numpy as np2 r- A0 i& ?/ x5 p7 b
    from PIL import Image( ]4 Q( u; b# b& ~7 Z2 h
    from matplotlib import pyplot as plt
    + I+ {7 x# d5 q8 {3 ^import matplotlib.image as mpimg. H4 {# ]% z3 Y2 i! q* g
    0 `/ C% ]* d) \" S9 v
    def rotate_image(url):
    # `. ?1 q' S9 `3 q3 `; y# M% n        #旋转图像,并将其保存为4种角度的图片
    # h+ s0 H( o7 R6 W5 z: w    im = Image.open(url,"r")
    ) h, f1 J2 h8 h) K2 [    im = im.convert('RGB')  #避免有些图报错 8 A9 z3 L2 r+ \1 O9 [+ ~, |
        im.save('image_test/test_0.jpg')
    / z9 ?) f7 D8 _6 J3 W    im_90 = im.transpose(Image.ROTATE_90)3 K' q7 {9 L( q6 I
        im_90.save('image_test/test_90.jpg')
    1 r: k7 d4 o# D2 e3 x, P    im_180 = im.transpose(Image.ROTATE_180)
    8 E- L: [3 V* P5 B( \    im_180.save('image_test/test_180.jpg')
    2 D7 v2 a. Q  ~- {' {    im_270 = im.transpose(Image.ROTATE_270), z" E6 t8 m1 E3 k; _6 u, g
        im_270.save('image_test/test_270.jpg')& T0 d* H3 Z8 v4 S6 H( L% `7 E

    8 T, h: l# Y% G% F( v9 |3 w3 Qdef plt_merge_img():, D4 B; M! m$ I, M! h( Q" F
            #将保存的四种角度的图片,叠加在同一张画布上( ]: U8 c! K1 R/ n0 |0 [
            #使用plt.figure()创建画布,并用add_axes()来分割区域显示图片  u/ v* ?4 M( r3 W8 u; K
            #显示画布,并将其保存为fig_size.png# r+ ?# {; ]8 r9 k  L2 a1 |$ P9 R
        img1 = mpimg.imread('image_test/test_0.jpg')( T9 ~5 }: {7 F% B7 i
        img2 = mpimg.imread('image_test/test_90.jpg')
    ( E- Y3 ]. _- w. M+ J  a    img3 = mpimg.imread('image_test/test_180.jpg')) `2 x3 X+ G' ^
        img4 = mpimg.imread('image_test/test_270.jpg')
    * c2 K" Q& [3 I    fig = plt.figure(figsize=(60,59),dpi=96)
    / A; t: c6 i# i7 c9 \. M& u1 l" l0 l- g- z$ ?$ W4 Z6 s, X
    #上方的横图
    " j" d9 R; X& s$ {$ Z  V7 [    ax1 = fig.add_axes([0.30,0.55,0.42,0.28]): n9 K$ E4 X; E( s. E# H) O
        ax1.imshow(img1)
    2 F9 d4 p: b" }1 [) C    ax1.axis('off')" O1 I( N: S$ h% y5 u  u

    ; Y8 }+ B3 C. A" R( g  M# 右方的竖图/ g! @8 @3 X! X$ L3 l6 H( ~
        ax4 = fig.add_axes([0.67, 0.29, 0.28, 0.42])8 L. Y, ~" u4 R/ K9 i
        ax4.imshow(img4)
    7 ?+ q% t6 u2 N! z; c5 ?( m1 W    ax4.axis('off')( Q; ]. }3 p5 o

    + C% z: _7 T6 X4 W# 下方的横图
    & k: _2 O% d% ~6 Z' ?/ g' T    ax3 = fig.add_axes([0.30, 0.18, 0.42, 0.28])' z6 r5 p: F; j& J
        ax3.imshow(img3)+ M1 C" }+ |& ~8 B6 c/ Z
        ax3.axis('off')
    / ]  v1 o1 h' {  l: Y; @
    ; T9 T; l+ p( ?4 X; L* S#左方的竖图5 N6 x1 v$ [+ V0 `' m
        ax2 = fig.add_axes([0.07, 0.29, 0.28, 0.42])
    ) x5 ~7 A* A- K% ~' F1 G    ax2.imshow(img2)) z, d' v8 H0 e5 e
        ax2.axis('off')6 F8 t7 w5 ~' v' @
        # 保存为sig_size.png& C, V% g' p3 Y) C% E
        plt.savefig("fig_size.png",dpi=96)
      {! f, z6 b+ \. D% Z! M  `    plt.show()
    $ o% J9 X+ E3 I+ E1 M+ \, [$ x* x0 ~5 r: I" ]) x6 T$ |. H9 |3 e
    def main():
    ' ~" H7 Q; d# O; Q+ i3 \    url = 'test_1.jpg'
    6 q0 s1 Y; R! R( J9 d    rotate_image(url)
    - J( ], n) u& [' H8 {5 L4 ^  B    plt_merge_img()
    0 z# o1 `" \! e2 `& H
      c% m/ Y3 M; ^; j9 C' z% w6 G: fif __name__ == '__main__':" T: O: S4 O4 |! G
        import warnings+ a# }) l3 S8 z& F2 u2 G* t6 U, e
        warnings.filterwarnings("ignore")
    : I* Y3 o) h; a; p$ @0 a    main()& @# M+ |7 |% t0 C( }+ W6 q
    2 g2 E3 h6 R% n6 W
    ————————————————
    ! @9 H$ C) D. I9 P, N, J" _版权声明:本文为CSDN博主「你要啥自行车」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    ( C0 R! d, _* `- j. I( S原文链接:https://blog.csdn.net/weixin_42572826/article/details/106033709
    : M; M3 X3 V8 e! Q* N$ f5 W0 j9 `1 e0 C# l+ l
    ) @) ~( h) Q. y/ V7 i% P; Z9 b

    6 {! _1 ^( o* Y1 p6 e
    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-6-9 21:28 , Processed in 1.119189 second(s), 58 queries .

    回顶部