QQ登录

只需要一步,快速开始

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

    ; G: w0 ^: o0 q4 _) h, p4 m9 Vpython4次旋转图片后,多图叠加显示
    " a: c0 j  J; A2 w* q0 P' Q[color=rgba(0, 0, 0, 0.74902)]文章目录
      8 a( r: L  _5 ]* K% ^& m, |! e# Q: q
      • 想要的效果对比,原图VS显示
      • 问题
      • 要点
      • 代码
        % u, T$ l2 e6 V; {$ T8 f  w
    / ?* B$ u% \- b

    # j) v4 E! J: R4 |8 P) q: e) A[color=rgba(0, 0, 0, 0.74902)]前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog, |; h8 G  G7 C
    想要的效果对比,原图VS显示 1.jpg 1.jpg ) I) v6 k# |/ _8 ]1 E, k7 x! p4 K
    ' E. X9 x; a* P+ p; Q
    8 N. [0 {0 w$ p8 J5 ~0 I
    问题: Q0 Z" }6 v6 w7 `% R/ C
    8 H1 T( x5 w% N4 W& i
    (1)在刚写出来时,在rotate_image()函数中没有加,im = im.convert(‘RGB’)这句话,就会出现有的图正常,但是有的图报错,无法保存,并显示下面这句话
    5 e$ V* g* y" A; ^; y- s
    2 n; d4 b/ \& R; ~这个问题可以在这一篇blog找到解决方法。就是im.read(url)后,再将图片转换为RGB格式(image.convert(‘RGB’))。这样就可以避免很多因图片导致的问题
    / M! x- N! ?7 |: v) F6 h' l! a7 r
    : O; A2 \  h9 T5 {, W$ o% C(2)在matlabplot中,显示图的第一步是创建画布,plt.figure(),然后在画布上添加子图,最后显示整个画布的图像时,并且让子图自适应来显示。而我遇到了这个就是关于self.figure.tight_layout()的警告,见下图。
    ) I9 X1 Z* ^$ u5 [4 v' f% C* z7 Y3 s" V1 q% A1 J* _% a
    一般在使用plt创建一个画布后,程序本身会有一个自动调整子图尺寸来使用画布的情况,但是因为我是显示图片,所以这个自适应就出问题了。但是还好,只是警告,不是报错,为了方便,忽略就好…(但是我不推荐这种做法,希望有人研究一下,并把解决问题告诉我)# @" B3 p/ t  H- j. `* D
    为了方便,我直接在一开始加上下面这句,忽略掉。
    * X* G5 O2 p' q1 `import warnings
    . L! x  _# t% V8 hwarnings.filterwarnings("ignore")
    . l2 @% i- t; A% i- U8 q- c) t; V/ D# c' E  J% z
    要点+ @1 F: o  E7 f6 h5 q3 B: W# \

    1 g2 R7 B0 d' W1 x. t1 k1旋转图像现成的工具很多,一个是cv2提供的,主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图:6 f( Y+ V  U2 F2 B+ B

    : w% F+ n& r3 Y' @
    % N) b2 r& G6 C$ U9 E 3.png 3 p1 j7 c  N# D- l

    * r, p9 S# R- D$ X5 B- h这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。
    3 L$ D# b8 `; G# V8 c) D9 u% l) N2 a# f' H
    这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图
    " _0 j6 Q+ s1 z. T
    , _: Z$ s( R. d% \. V( n$ T. R% I' A/ Y! |
    4.png 3 M6 |! Y% s3 S3 e8 X* X! _
    & {+ s# q; ?+ T% z0 h0 U& }' a
    代码#! /usr/bin/env python& i/ w, f: W$ p
    # -*- coding: utf-8 -*-
    5 ~6 O/ x+ ~0 \# ! python3) L. C/ T* `, U% y

    ; Y7 s. R' v6 @( C9 ?import cv2
    ) H( g( d' a/ dimport numpy as np! o- h% c, Q. r: s" j3 |
    from PIL import Image. F6 Z. ]) J0 n4 A" N" a$ N
    from matplotlib import pyplot as plt9 x3 N' C1 i: r" `
    import matplotlib.image as mpimg
    4 b) U' \* n6 |
    . U4 Y& m8 s" ]6 c- Mdef rotate_image(url):
    6 S# H8 @% X1 z  H$ j7 m5 s        #旋转图像,并将其保存为4种角度的图片
    * A8 E( b4 o) p* t! `$ _+ x: F    im = Image.open(url,"r")' L: c2 K0 z" P/ B' b
        im = im.convert('RGB')  #避免有些图报错
    * L% ~5 {, o2 x/ s$ ^4 [    im.save('image_test/test_0.jpg')' s3 F+ `- g6 e& C( f  b
        im_90 = im.transpose(Image.ROTATE_90)) U* {" e* u/ V2 D
        im_90.save('image_test/test_90.jpg')
    " f  z. A: V: l$ ~. o* O3 u& r    im_180 = im.transpose(Image.ROTATE_180)
    , y6 [3 R) @  c" _5 K/ z2 n# v$ T    im_180.save('image_test/test_180.jpg')& ^2 J/ e! a" p: D# ~' D
        im_270 = im.transpose(Image.ROTATE_270)
    3 {' ~; @- e9 `, v% K" D8 B* k    im_270.save('image_test/test_270.jpg')
    1 _: \. b& w' g2 y+ H3 p0 s4 [
    , r  e( z# |) [/ ]def plt_merge_img():
    ( \% V, k# l" x$ Y: H        #将保存的四种角度的图片,叠加在同一张画布上( p0 I) p' P4 i! c
            #使用plt.figure()创建画布,并用add_axes()来分割区域显示图片- _# t/ y8 W  {; L
            #显示画布,并将其保存为fig_size.png% t0 {) C* [3 Q8 R4 s% Y. a
        img1 = mpimg.imread('image_test/test_0.jpg')' Z9 ]* @  j( p: M* V' _" Q
        img2 = mpimg.imread('image_test/test_90.jpg')0 W7 y$ a; {. k5 W6 y$ Y
        img3 = mpimg.imread('image_test/test_180.jpg')
    $ j! y- P2 J- i3 {    img4 = mpimg.imread('image_test/test_270.jpg')' i) ?' A9 x0 V7 p- ?2 p
        fig = plt.figure(figsize=(60,59),dpi=96)
    7 |% @* G/ x" E6 B+ I% R. o" u2 o% J1 c$ A# F8 R, C  S
    #上方的横图/ ?7 ]3 Y% H" ?" x
        ax1 = fig.add_axes([0.30,0.55,0.42,0.28])
    , {7 T( V$ n# X  r2 Y    ax1.imshow(img1)+ t: i& d4 k) d3 C& L1 R9 [; E
        ax1.axis('off')
    2 L, }0 H: g# w) |7 l0 C% `; l5 f8 S0 G* V" _* [. T6 Y! d" f) y6 z$ w
    # 右方的竖图0 K% I/ C( Q8 w5 q* G1 {
        ax4 = fig.add_axes([0.67, 0.29, 0.28, 0.42])6 ^& z% A" ]' N. d0 c
        ax4.imshow(img4)
    " t; J7 m- [8 B    ax4.axis('off')
    7 R) X( X% J/ Q" o, J/ E1 I( r! Y9 p9 E& C2 W( p1 L
    # 下方的横图/ C# |4 G4 H, |# p! k9 R! N' G
        ax3 = fig.add_axes([0.30, 0.18, 0.42, 0.28])
    ' J7 ?9 ?" Y9 ~" r7 f; T    ax3.imshow(img3)
    * M. m. b2 v. ]! K' e" I* Y6 M    ax3.axis('off')
    ' L+ x6 _- R: W# _9 ^# ]7 E# B8 V. M5 }3 ?1 L
    #左方的竖图
    ) ]* K# Y% r) }' e* h4 ?    ax2 = fig.add_axes([0.07, 0.29, 0.28, 0.42])
    8 [' E8 @* N# N. k, W- w8 b6 s) G    ax2.imshow(img2)
    7 A) R2 \7 R+ @' v    ax2.axis('off')( C0 B- ]: L2 {+ k5 s- C3 O
        # 保存为sig_size.png$ Q3 n7 h7 r+ B) t
        plt.savefig("fig_size.png",dpi=96)
    & J" B. |! O& k0 l    plt.show()& }0 `9 O. V/ A8 O! Z5 B( Z

    0 ^. x4 M4 `5 {def main():: G% ^0 H' |  f9 @( a5 A  ?. Q
        url = 'test_1.jpg'% {6 N! ^! @: F' {& T) |# ]$ u
        rotate_image(url)9 t6 R! i( M4 v& q
        plt_merge_img()# ?* _* b3 b) C; i

    ) D3 y8 E: U! `2 Rif __name__ == '__main__':
    # Y, D- j: ^# D4 x2 B1 l    import warnings
    - U; j. m0 _' g  o) }% G' _    warnings.filterwarnings("ignore")
    ! H1 A  T4 C: J) R; p/ {    main()8 m8 T; f4 T. b/ f% ^: G. H; V
    5 l, v' J' O% ]1 f
    ————————————————
    : n( N: E1 O1 ?9 {% v% Z" N: Q8 C2 U版权声明:本文为CSDN博主「你要啥自行车」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。9 o; _1 q, n2 Z& Q9 J
    原文链接:https://blog.csdn.net/weixin_42572826/article/details/106033709
    : w- c0 Y$ ^0 N3 ^. F# `# r- i" u1 M. E. A8 `

    5 M  e( D* t5 v. _8 r
    6 [. ]0 O3 f$ J, b* Z7 z0 x: i
    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-20 13:32 , Processed in 0.431281 second(s), 59 queries .

    回顶部