QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1614|回复: 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
    ) J9 N/ C( W, c$ f. L
    python4次旋转图片后,多图叠加显示
    + l3 W2 I9 P* I* s8 u( ^) F[color=rgba(0, 0, 0, 0.74902)]文章目录

      $ ^& P  k  y/ N; ^/ q& C6 `2 b- a
      • 想要的效果对比,原图VS显示
      • 问题
      • 要点
      • 代码
        % b1 C' P- D) F
    : a2 x. s$ C+ }* Z5 g
    ; l% `- J/ k7 C5 p; B& ^8 c
    [color=rgba(0, 0, 0, 0.74902)]前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog
    " k$ E) I- B0 m想要的效果对比,原图VS显示 1.jpg 1.jpg
    - j1 Y7 Z& U- z1 g1 {( r9 o# N: p$ G
    2 O# T/ t2 v3 n; t
    问题
    * }5 R+ u2 K1 A. X& F
    9 E. f5 v  v7 b" _2 b0 }- [(1)在刚写出来时,在rotate_image()函数中没有加,im = im.convert(‘RGB’)这句话,就会出现有的图正常,但是有的图报错,无法保存,并显示下面这句话3 h- a+ y  p; I5 ^' D! h

    8 V* \- m) s7 B. q! ]这个问题可以在这一篇blog找到解决方法。就是im.read(url)后,再将图片转换为RGB格式(image.convert(‘RGB’))。这样就可以避免很多因图片导致的问题2 w3 ?% h& v$ o5 t8 Z6 m$ ?

      l7 f) e+ B- h(2)在matlabplot中,显示图的第一步是创建画布,plt.figure(),然后在画布上添加子图,最后显示整个画布的图像时,并且让子图自适应来显示。而我遇到了这个就是关于self.figure.tight_layout()的警告,见下图。
    & J* x+ U2 ^  O$ J6 ^
    5 s- `1 d, a  Z一般在使用plt创建一个画布后,程序本身会有一个自动调整子图尺寸来使用画布的情况,但是因为我是显示图片,所以这个自适应就出问题了。但是还好,只是警告,不是报错,为了方便,忽略就好…(但是我不推荐这种做法,希望有人研究一下,并把解决问题告诉我)
    + O$ g4 ~" r9 u8 v4 x4 z为了方便,我直接在一开始加上下面这句,忽略掉。
    & r1 d! O6 {& himport warnings
    1 v( @5 D: U/ dwarnings.filterwarnings("ignore")# t1 z( S* k- J- u2 g3 w
    ( X9 W; _7 V* Y# m# k' w$ B
    要点/ b% f* ]; R+ H! I: C. G4 ^! X& A
    9 m) U% i' {+ W$ @/ X# k
    1旋转图像现成的工具很多,一个是cv2提供的,主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图:
    2 T# p2 _$ c* A* L& p* @0 W* w$ O
    : f' h8 A" Q( x( w# g- u% ~$ O6 v
    ( U: p, Z! [8 e) ~7 P1 u 3.png 9 v2 Q9 S# ~) n4 `+ ]1 B& e

    4 s& R, n/ B, [! |. n( A这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。) K" r" e7 R+ ?5 ]- ^  Z$ Q

    1 z! K1 l% x+ t这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图
    * c' N: |. f  A* D1 w% C) l9 m( W7 u9 W
    5 T6 p0 r6 u+ |; P, c- q. ^
    4.png $ F1 o" `) `# r" K* Z) b

    " J8 c( m1 R. F* I% z代码#! /usr/bin/env python# J- @6 o* q0 v, X8 M6 w
    # -*- coding: utf-8 -*-  B9 v, b& @# N/ T; }- Y& f
    # ! python3
    5 s$ y3 t9 V3 B9 k5 H* c1 _% [5 ^& x& J% x# ]7 n" c
    import cv29 o  n6 N( n- `# u) V+ F: h
    import numpy as np
    0 `! J: L/ `3 o( mfrom PIL import Image
    + Z( A8 ?1 f* _from matplotlib import pyplot as plt
    # d, L8 |# S$ w5 r) J, z1 P) nimport matplotlib.image as mpimg9 C1 q3 A1 _% x/ K& P1 {, {4 v
    " j) d  [0 ?& n, \. K8 G
    def rotate_image(url):
    1 `/ H" \: t5 w9 }8 s/ I: ?3 w  Y        #旋转图像,并将其保存为4种角度的图片
    ! X6 ]4 w. W+ b7 v) ~* J    im = Image.open(url,"r")3 ?1 O7 o$ C6 }
        im = im.convert('RGB')  #避免有些图报错 2 M5 ^; Q2 Z& P5 \, d  P( L# S, z
        im.save('image_test/test_0.jpg'): U$ D. ?5 x! C( p$ a
        im_90 = im.transpose(Image.ROTATE_90), k  j4 Q& j# l& D
        im_90.save('image_test/test_90.jpg')
    5 {* ]! b% l9 I' g    im_180 = im.transpose(Image.ROTATE_180)* i- ]) Z* w2 D# x; Y
        im_180.save('image_test/test_180.jpg')/ V* o  M2 k  d+ g
        im_270 = im.transpose(Image.ROTATE_270)& Y- P+ N& e: C8 _4 S
        im_270.save('image_test/test_270.jpg')& c' T* `8 |* j$ N; f$ f3 _- a

    # q3 X0 X: M; y9 [def plt_merge_img():
    " @0 f2 r* z7 l( R        #将保存的四种角度的图片,叠加在同一张画布上
      l, u( Q$ |" B: E; L# v# J        #使用plt.figure()创建画布,并用add_axes()来分割区域显示图片; N# v8 M0 `/ s. g9 E7 x2 S
            #显示画布,并将其保存为fig_size.png
    : j; p. i6 r& L5 N    img1 = mpimg.imread('image_test/test_0.jpg')
    3 n+ l! H& F! w! q- y    img2 = mpimg.imread('image_test/test_90.jpg'), t2 ~% F* V2 L6 C5 ~/ f
        img3 = mpimg.imread('image_test/test_180.jpg')+ A# m5 a# x4 ?& T1 i
        img4 = mpimg.imread('image_test/test_270.jpg')9 }4 }2 y; T* @, y
        fig = plt.figure(figsize=(60,59),dpi=96)
    . p- q% o1 e8 M0 [% i2 z
    * `5 C" G/ a; s+ m#上方的横图
    - f  l( c6 O- M2 j& T/ B- k" E9 D    ax1 = fig.add_axes([0.30,0.55,0.42,0.28])8 z# h' D& Z% d- I
        ax1.imshow(img1)
    8 T+ S: W; J6 i1 P9 W    ax1.axis('off')
    ( x6 k/ F* B, `9 U; P; ~. D) C9 P4 d3 x) O  M0 X( o
    # 右方的竖图/ M' y1 ?+ {/ z! o6 ^. ]& n8 E, y
        ax4 = fig.add_axes([0.67, 0.29, 0.28, 0.42])
    " b' q, s7 Z7 O( x$ E' o# k( S1 R    ax4.imshow(img4)
    ; Z9 U4 Z' r! o# F! Q    ax4.axis('off')1 n# y6 m- }) I, R
    / @: D3 G7 }3 l. D/ z/ L
    # 下方的横图: u. @3 y! I9 V( H# e
        ax3 = fig.add_axes([0.30, 0.18, 0.42, 0.28])
    0 ~7 e. @: d. e& z3 I    ax3.imshow(img3): i6 r6 i& G- H. J: f9 Q
        ax3.axis('off')
    / w' K* z) ]2 `3 \4 @3 ^/ X' e! {/ b) d. S% L/ G: y& H, m
    #左方的竖图
    2 o( j7 |7 {% W7 \/ k! c% `* ?    ax2 = fig.add_axes([0.07, 0.29, 0.28, 0.42])
    8 L9 {+ X: K1 P. B( o- m1 @    ax2.imshow(img2)1 o' y6 e6 [8 q4 Y1 C: O
        ax2.axis('off')
    , ~" E& B0 N" c    # 保存为sig_size.png4 Y, M3 N% d) W7 O7 M' M; T$ F
        plt.savefig("fig_size.png",dpi=96)/ ]4 d" U! E3 Y& W+ L
        plt.show()
    + H5 u9 Y# f& b% ?* a1 F$ Y# V% P2 f; C: B& P
    def main():
    $ _1 f$ c% Q; }    url = 'test_1.jpg'8 x- i  T1 K, g2 T. r9 P  Q/ d) N
        rotate_image(url)
    ; _" x- k( `) f9 L7 C& C' B, _- t    plt_merge_img()# h: @( O7 `2 [$ E7 z$ k: J9 v4 W3 f9 C
    - T7 g1 w3 [9 |8 y2 }2 b1 K
    if __name__ == '__main__':; _& V- E$ f  l( O
        import warnings. T3 U: `9 I1 J- o! b7 X" r1 J# b
        warnings.filterwarnings("ignore")
    - V+ r  j4 C, M* M8 ?) V/ }7 v9 x    main()
    . r3 ]1 U# b' F( a4 O6 y- C1 X+ x8 A$ h+ @3 c- w* o
    ————————————————
    * ?9 r/ j& o9 t版权声明:本文为CSDN博主「你要啥自行车」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。' q' \( L7 r/ \- o
    原文链接:https://blog.csdn.net/weixin_42572826/article/details/106033709$ A" F9 y$ k' R) Z5 `

    % E1 b; ~; ^( `6 S' V# l+ R2 S( |) J0 [

    + M; }8 Y( j4 k) i  p' B# j
    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 23:04 , Processed in 0.407038 second(s), 59 queries .

    回顶部