QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1578|回复: 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
    0 M! p( C( ^! I0 q: _: s! N
    python4次旋转图片后,多图叠加显示6 F- m! b- A5 I
    [color=rgba(0, 0, 0, 0.74902)]文章目录
      : ]/ T" k. m% E) A0 T
      • 想要的效果对比,原图VS显示
      • 问题
      • 要点
      • 代码
        4 B. H' [: Q& v' S8 x/ k6 L) K0 n

    ' d; e2 G, d5 k5 j% p/ E* \) u* B0 N. x9 ]
    [color=rgba(0, 0, 0, 0.74902)]前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog1 k( i+ \, q$ X& A$ ?
    想要的效果对比,原图VS显示 1.jpg 1.jpg
    5 _5 [, ]6 B% ~2 t( r9 u8 t9 m; d# j) |3 C* ?) B1 Q7 B
    $ ?8 H/ j- [4 N2 J* h  [0 f: m: [
    问题! C6 [- V; e$ m- z8 j8 X- |

    4 b: |5 q! L4 P0 L/ c(1)在刚写出来时,在rotate_image()函数中没有加,im = im.convert(‘RGB’)这句话,就会出现有的图正常,但是有的图报错,无法保存,并显示下面这句话
    . }2 B; B; Y( Q( o5 K+ R9 M
    ! S6 m: k. }) \% Y% c这个问题可以在这一篇blog找到解决方法。就是im.read(url)后,再将图片转换为RGB格式(image.convert(‘RGB’))。这样就可以避免很多因图片导致的问题
    & y% P: `0 z0 z4 {% ~7 s
    ) T/ t+ d" S, ?8 i2 t# p(2)在matlabplot中,显示图的第一步是创建画布,plt.figure(),然后在画布上添加子图,最后显示整个画布的图像时,并且让子图自适应来显示。而我遇到了这个就是关于self.figure.tight_layout()的警告,见下图。( L8 F6 s( b! m0 C$ i. X3 H. [

    ' c4 k; c+ X5 H6 O* \  u# t一般在使用plt创建一个画布后,程序本身会有一个自动调整子图尺寸来使用画布的情况,但是因为我是显示图片,所以这个自适应就出问题了。但是还好,只是警告,不是报错,为了方便,忽略就好…(但是我不推荐这种做法,希望有人研究一下,并把解决问题告诉我)
    / r- M- l! t3 A为了方便,我直接在一开始加上下面这句,忽略掉。6 o  g  Y) E1 J+ Z; z- d, c4 k: p
    import warnings
    1 z1 F* c4 Z3 m+ }7 B9 _warnings.filterwarnings("ignore")
    3 a. Q0 L# Z1 U! @; Z! Z' }) R* t! b; c2 f3 Y6 B
    要点- ^. ~" v* p3 A* E' M  Q

    ! \3 Z2 O5 E4 [1旋转图像现成的工具很多,一个是cv2提供的,主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图:3 ^; k( k, u& r8 ], k) s) h
    ; u! u3 L2 o3 R3 U8 d3 h
    0 d8 Z# T8 V" R: Q
    3.png
    , n! t* ]9 e) V& r- T' A# z
    " Q3 l) r. [% U" ]' h2 _* }! m6 S这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。
    5 t* W+ ^: N  w# n& F5 m; y+ z' A7 T+ b
    这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图
    9 ]+ D4 M: H. I+ G% d+ S* }% |; d6 U1 R: P* d

    $ i' [! X2 c; p3 G+ _ 4.png % \3 D7 M) O2 X  b. ]# A
    2 V# e( f4 x/ a' |. P% k
    代码#! /usr/bin/env python5 G+ u' t/ u: @. x8 A( R# S
    # -*- coding: utf-8 -*-
    - b. h6 v# B, o/ h# ! python3) n' Z% @. `' @( E+ m1 u+ P* a
    0 i$ I' ]3 Z2 a
    import cv2. f* m4 `  j9 `5 s  ?- e& B2 }
    import numpy as np& _( g, J/ u. i2 U. ~
    from PIL import Image! j' `4 G! n' r  H
    from matplotlib import pyplot as plt: |% |2 j  G- h/ a; f
    import matplotlib.image as mpimg
    4 r3 F, w6 T1 J
    ' M6 a! ?/ ^3 \8 E$ D# y: r# [def rotate_image(url):
    9 v* P) F9 U$ [) _3 z        #旋转图像,并将其保存为4种角度的图片  r; h, A( x9 b2 b: m
        im = Image.open(url,"r")/ K( V) n- o: |0 F* l8 \
        im = im.convert('RGB')  #避免有些图报错
    ! T+ W% Q# J9 K  J# ?1 [    im.save('image_test/test_0.jpg')( l5 w) {- c6 f9 J1 F
        im_90 = im.transpose(Image.ROTATE_90)6 ]0 f" `) Y# K) |7 M4 u
        im_90.save('image_test/test_90.jpg')
    - d2 w8 J5 x. [5 |% H1 S/ e  M: d: L    im_180 = im.transpose(Image.ROTATE_180)+ D7 M- o( a1 l+ n3 \
        im_180.save('image_test/test_180.jpg')  D4 x; N9 S9 W1 i+ |# K( S
        im_270 = im.transpose(Image.ROTATE_270)1 L* D' v: R# X1 ^/ [# `
        im_270.save('image_test/test_270.jpg')
    0 ^& x6 G* u2 S9 I, q1 D2 N" _5 `7 P  e* t- w2 H' k" V. m6 A; N
    def plt_merge_img():  C8 o# P8 N( q9 |
            #将保存的四种角度的图片,叠加在同一张画布上& u* C& j8 D# Z0 C; R5 h  J
            #使用plt.figure()创建画布,并用add_axes()来分割区域显示图片/ ?; J5 A& j$ M
            #显示画布,并将其保存为fig_size.png  h0 Z3 T( ~" f$ {' U5 l2 @
        img1 = mpimg.imread('image_test/test_0.jpg')9 z, m+ A  p  H5 ]4 S
        img2 = mpimg.imread('image_test/test_90.jpg')
    " a' D2 L9 L  v+ {$ y9 I7 M4 z& E6 E( `    img3 = mpimg.imread('image_test/test_180.jpg')% U# f4 `& f" G6 D; ^% H
        img4 = mpimg.imread('image_test/test_270.jpg'): ]: i8 B+ |  C/ G
        fig = plt.figure(figsize=(60,59),dpi=96)
    ) b4 J7 k: b) n
    # O, d: w: G* ?#上方的横图
    ) U6 H$ f5 N, ]: l# |2 }! {- C    ax1 = fig.add_axes([0.30,0.55,0.42,0.28])
    ! s: j  d/ |  c* X+ Y4 g# E% B8 s( W    ax1.imshow(img1)+ ?4 h( e1 t% c) w
        ax1.axis('off')& R/ z$ n5 z2 m! W

    ( E9 x- K4 O$ D" c; H0 c/ i+ J# 右方的竖图
      n/ F' z. p( m+ k+ Y    ax4 = fig.add_axes([0.67, 0.29, 0.28, 0.42])3 w0 s, ^3 f/ X+ I0 P+ l
        ax4.imshow(img4)
    : W5 p0 N8 @( P$ |& U$ h4 m    ax4.axis('off'); Z% R4 J0 d8 _6 f, O0 x; M

    - E: ?0 i- q, T* s& i# 下方的横图
    9 F' u+ C" q# I1 ?    ax3 = fig.add_axes([0.30, 0.18, 0.42, 0.28])
    . n* ~: {, _7 O( d1 y    ax3.imshow(img3)
    7 U& a6 W! ?! z9 r8 v    ax3.axis('off')) M. n7 f8 v, a2 N5 Y/ S

    . ^# J) c; \4 W7 @" S% z* a3 G$ G#左方的竖图7 T4 e" G1 u5 h
        ax2 = fig.add_axes([0.07, 0.29, 0.28, 0.42])
    / }  o6 P3 T2 h- R    ax2.imshow(img2)$ s& N2 @/ Q2 q# ]8 s' v: g
        ax2.axis('off')
    ! a( b" ^8 ~7 e  k/ Q4 K    # 保存为sig_size.png' ^0 j4 d: g$ H' p4 Y- r7 k8 n
        plt.savefig("fig_size.png",dpi=96)
    $ w2 g4 R3 @% r/ A/ N9 Q8 Y    plt.show()- W. y7 E  v. ?# _/ h% x- m
    ) c, V/ m. y8 A
    def main():( {6 Z3 w- W/ ?
        url = 'test_1.jpg'- Y( [8 ~& e! e, \% j* S: X6 e
        rotate_image(url)' Y) P1 ^" h5 G- A
        plt_merge_img()% U: ^2 F2 |, `8 M2 @& _5 U8 @* L9 i
    * A1 N$ ]' X" g0 E2 q5 q* Y
    if __name__ == '__main__':0 t5 ?" K; T2 ~- H/ U0 T0 w
        import warnings; z& s$ o- @+ t( A
        warnings.filterwarnings("ignore")
    ' u! g) w. p4 z6 `9 f8 y5 V  `/ X; M    main()
    1 E" }* y) J0 T# B# \; ?, f8 a' J. O6 i. g" m( x0 y
    ————————————————
    1 Q3 ]( w* V7 M8 b0 S版权声明:本文为CSDN博主「你要啥自行车」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    % z/ [/ m, p3 t$ n# J2 P原文链接:https://blog.csdn.net/weixin_42572826/article/details/106033709/ u$ p! _1 ?% z

    7 Y2 P8 U. j3 o
    $ I2 m5 S2 C* m3 B5 G0 N. C
    * ?$ J4 r# |5 j6 h6 }( 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 12:52 , Processed in 0.381106 second(s), 59 queries .

    回顶部