QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1613|回复: 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
    & z; n8 W) ?  G& J
    python4次旋转图片后,多图叠加显示( i6 G9 |7 }$ M) @2 F2 M2 B. C: p
    [color=rgba(0, 0, 0, 0.74902)]文章目录

      ( l. o; E6 a( J+ G
      • 想要的效果对比,原图VS显示
      • 问题
      • 要点
      • 代码$ r/ E& p& s- Z8 I7 I  J
    , A! L* D4 d( H2 j

    1 ~' w* ~( o  `/ v4 N! l3 x. `. l9 F[color=rgba(0, 0, 0, 0.74902)]前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog6 @; _9 A9 i8 E
    想要的效果对比,原图VS显示 1.jpg 1.jpg % e/ v# l6 j# g5 s1 ]' w

    * u( S4 K- r) W% D6 P+ Y
    7 ~- g. j5 b: X" C/ {+ U. X* s$ l问题
    0 V' N4 C+ M$ B: T3 `, |% t1 V* F6 k# C0 H. ?3 [4 t/ n
    (1)在刚写出来时,在rotate_image()函数中没有加,im = im.convert(‘RGB’)这句话,就会出现有的图正常,但是有的图报错,无法保存,并显示下面这句话
    ( O# j$ I) }8 o& n5 q# d  D1 g# d" R- |2 ]3 `# C  l) y, p
    这个问题可以在这一篇blog找到解决方法。就是im.read(url)后,再将图片转换为RGB格式(image.convert(‘RGB’))。这样就可以避免很多因图片导致的问题
    5 ^$ k1 w* X/ J# K' b2 f. w* a
    7 B' f, R" x- T+ u$ g) f(2)在matlabplot中,显示图的第一步是创建画布,plt.figure(),然后在画布上添加子图,最后显示整个画布的图像时,并且让子图自适应来显示。而我遇到了这个就是关于self.figure.tight_layout()的警告,见下图。
    6 Z- Q$ a- H5 D$ _# k# e! L% t4 F8 T* p1 a4 k, E
    一般在使用plt创建一个画布后,程序本身会有一个自动调整子图尺寸来使用画布的情况,但是因为我是显示图片,所以这个自适应就出问题了。但是还好,只是警告,不是报错,为了方便,忽略就好…(但是我不推荐这种做法,希望有人研究一下,并把解决问题告诉我), y( H3 c* f1 r" E7 {' T1 f" x8 }
    为了方便,我直接在一开始加上下面这句,忽略掉。1 u% t+ p% k" v
    import warnings
    $ A' p: |' ^9 m* v! s3 kwarnings.filterwarnings("ignore")+ k1 k& ^+ T% r8 E5 S  `

    " L( k! \- L" O" z7 ~要点
    * I, l6 ~: l1 X2 E8 G7 ]* _6 n7 `* @, N$ f& i% ~
    1旋转图像现成的工具很多,一个是cv2提供的,主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图:
    ! i! ]! t( S0 ~9 a; |; K0 S  P  C$ C( H# y4 A5 O, L2 C6 ]( Y
    & N; [5 m4 W# [0 I* p3 X
    3.png % }0 M/ i# X: ~, ]  ?
    . e( U. O& B) \6 B. o
    这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。
    3 s, k5 {: g) c& M5 Y& D, `( O+ O/ p* r) O' G6 h" N0 ^, W
    这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图
    2 a9 M4 K, Q6 Z) t3 ^2 _
    2 X6 K- x6 e6 i" Z$ z+ v2 n2 h; D8 }9 c1 K7 r9 b3 h) X
    4.png ' y& b8 V7 g$ R8 f3 r  v

    3 K$ }1 k- i2 `代码#! /usr/bin/env python
    " h, E' w/ s! ^8 V# -*- coding: utf-8 -*-5 }: f/ `/ H/ P' s2 f4 {
    # ! python3; l$ D# D# V% _
    2 I, R" `' q. U
    import cv2  H9 u; t1 ?' |) f( [- N# _
    import numpy as np) G+ M9 u5 w: ^( _0 ]. d
    from PIL import Image* t$ x' ~- N! K: q& V- N6 v
    from matplotlib import pyplot as plt
    1 l# N9 @- H: d6 W& Dimport matplotlib.image as mpimg
    7 S* t7 O* I) a% R: y
    5 _1 J! K  b# `" `$ fdef rotate_image(url):
    ( D+ o" ~1 a! C  v7 W        #旋转图像,并将其保存为4种角度的图片
    8 U( R  @$ A% O    im = Image.open(url,"r")
    0 c+ i% }# {! d6 n' O    im = im.convert('RGB')  #避免有些图报错
    " C" d' Z0 U  Z  N1 R9 T. ~    im.save('image_test/test_0.jpg'); f+ j2 D  c+ r: t) T
        im_90 = im.transpose(Image.ROTATE_90)& b9 R5 E/ I, U
        im_90.save('image_test/test_90.jpg')6 }! a; V: F2 I& _
        im_180 = im.transpose(Image.ROTATE_180)( P( z( i8 o8 ~' \; T
        im_180.save('image_test/test_180.jpg')
    # n- |3 S9 @" D, `    im_270 = im.transpose(Image.ROTATE_270)9 C, C% M# t  L. J" V1 w. R
        im_270.save('image_test/test_270.jpg')0 [) a& U0 @3 T1 }

    5 b- N; C. R3 ^* T" f; V. Rdef plt_merge_img():2 T6 c8 U/ e' v: ~% {8 D
            #将保存的四种角度的图片,叠加在同一张画布上+ s8 T3 t+ v  q* n' P+ W$ Z' P
            #使用plt.figure()创建画布,并用add_axes()来分割区域显示图片
    9 n4 D, |& \6 |, G" I        #显示画布,并将其保存为fig_size.png
    5 p0 `. y( x6 b# x9 V4 f3 r# ?    img1 = mpimg.imread('image_test/test_0.jpg')
    + L/ C9 K7 H  C2 f# C    img2 = mpimg.imread('image_test/test_90.jpg')% `9 ]! i0 T8 l, A& F" K
        img3 = mpimg.imread('image_test/test_180.jpg')8 ?/ m1 ]/ B# J& m  |6 f
        img4 = mpimg.imread('image_test/test_270.jpg')7 s0 d9 e# {# V* C5 Q' \
        fig = plt.figure(figsize=(60,59),dpi=96)$ m( X' x. b  h) C8 o
    2 h4 Q+ k+ j6 I, t
    #上方的横图8 t& b) x& B, Q; h
        ax1 = fig.add_axes([0.30,0.55,0.42,0.28])
    6 s8 [) S8 k7 \1 g9 N2 f8 Z, Z; L5 `    ax1.imshow(img1)
    4 w# H' j5 n1 q: O! H    ax1.axis('off')4 U# {; ]; d( J, _! q
    - d  P5 l& s" ~# u5 c! i) V8 n8 a. F
    # 右方的竖图% v! p: Y) J+ R- ~( b
        ax4 = fig.add_axes([0.67, 0.29, 0.28, 0.42])
    1 {0 @/ t% T2 [2 e3 o1 Y, k: F, M  d    ax4.imshow(img4)6 x0 u, j5 b- O2 H; j/ I/ q4 v
        ax4.axis('off')
    : q6 z4 [- ?, L1 N& ]9 o1 l- W& `2 y0 t2 h
    # 下方的横图
    $ `5 c7 v; D% l    ax3 = fig.add_axes([0.30, 0.18, 0.42, 0.28])
    8 ]+ C# |& N2 _% b+ ?! s    ax3.imshow(img3)
      M; f8 @: q$ v+ E4 C$ q    ax3.axis('off')
    $ r( b% m& M/ Z* m/ ?6 e6 ^' B& i
    4 L' t% w! V8 c% _" Q+ Z* e8 I#左方的竖图* W' n6 t% l9 D! U! I/ S2 R. _" ~) W8 y
        ax2 = fig.add_axes([0.07, 0.29, 0.28, 0.42])$ }6 ]& f7 ?% l- W4 `$ Z6 E
        ax2.imshow(img2)
      ^! _9 T4 r* H9 K9 N7 I    ax2.axis('off')
    / t+ Q- j7 S) ^. v) X. p    # 保存为sig_size.png
    " L- e+ z+ f/ v    plt.savefig("fig_size.png",dpi=96)$ D) y6 J( `" \
        plt.show()/ k% o6 J( M" h; @6 P# j, C4 l! Q

    & G3 o0 S- o' I+ B1 P6 S# A! S: J* {def main():
    / p7 X, W# I8 s3 ~$ M: W    url = 'test_1.jpg'
    8 e$ N5 E& u5 c( K8 X& F# u1 }- _5 q    rotate_image(url)
    - Q  T) M7 P- g- T    plt_merge_img()
    6 s# F% G' p' E, E2 |; O
    + j/ V0 ]7 x+ @1 e: O$ B5 C4 F4 ]if __name__ == '__main__':
    2 Q+ S$ G& f, j# ]. }8 k- g    import warnings! K; ^" Z6 v& u
        warnings.filterwarnings("ignore")
    " I1 c4 _  L' V, r    main()' K0 p! t* J4 _9 }$ E( I8 q, }

    : \6 u8 O/ v/ `* r8 [1 ~; e2 l  e————————————————
    * U% h$ \  n2 E& F( p2 o) [( _4 ^版权声明:本文为CSDN博主「你要啥自行车」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    ' o4 U( e! R' X+ _% V原文链接:https://blog.csdn.net/weixin_42572826/article/details/106033709
    # z$ k: l) v% w1 {: {) p; t/ c# s
    % T8 N- |' [4 x$ p* P+ N8 w

    / k$ A9 G+ J7 ?1 V2 N2 Y3 n
    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:41 , Processed in 0.354552 second(s), 59 queries .

    回顶部