QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1610|回复: 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
      p* k  Z5 c  k* \$ r5 ^
    python4次旋转图片后,多图叠加显示- h; h: s- o) M- O7 g5 O& J
    [color=rgba(0, 0, 0, 0.74902)]文章目录

      . O2 I" i- W* ~. M- {- O% _5 g% E
      • 想要的效果对比,原图VS显示
      • 问题
      • 要点
      • 代码
        , S* _' J$ X9 |% I1 F

    ; X1 t; I( h+ L# `6 T
    ; Y9 J. D3 C- O2 K0 i' }; a[color=rgba(0, 0, 0, 0.74902)]前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog+ |/ p& o5 m- e# j) P! ?* q
    想要的效果对比,原图VS显示 1.jpg 1.jpg
    1 G/ K9 d7 Q. _; \
    ! f3 |' T" Y: ?$ ]3 _! k. J* O0 f3 V4 e% y9 F/ I6 r
    问题- t) f8 {5 O! n0 l" F$ K0 g6 A' J& A

    % ~2 H5 V; f  K! A# j(1)在刚写出来时,在rotate_image()函数中没有加,im = im.convert(‘RGB’)这句话,就会出现有的图正常,但是有的图报错,无法保存,并显示下面这句话
    6 ]# @- J1 V9 y: L5 l& h- b
    , o7 t$ A$ l6 l' d& ~  A9 b1 e这个问题可以在这一篇blog找到解决方法。就是im.read(url)后,再将图片转换为RGB格式(image.convert(‘RGB’))。这样就可以避免很多因图片导致的问题1 H( @3 [3 S$ z/ n0 A, r
    % q) n0 ?$ H8 H- n5 V) L" @" ?
    (2)在matlabplot中,显示图的第一步是创建画布,plt.figure(),然后在画布上添加子图,最后显示整个画布的图像时,并且让子图自适应来显示。而我遇到了这个就是关于self.figure.tight_layout()的警告,见下图。1 W! {6 n! [7 P
    / d1 u6 d3 r, G! a5 v" i! z
    一般在使用plt创建一个画布后,程序本身会有一个自动调整子图尺寸来使用画布的情况,但是因为我是显示图片,所以这个自适应就出问题了。但是还好,只是警告,不是报错,为了方便,忽略就好…(但是我不推荐这种做法,希望有人研究一下,并把解决问题告诉我)
    ! r. a1 d5 H3 d为了方便,我直接在一开始加上下面这句,忽略掉。
    4 T* ], w) L! Kimport warnings, ^$ ~" {. E. [$ B% ~
    warnings.filterwarnings("ignore")4 |7 K3 U, a! h; L3 k& o
    ( }# S5 i0 N" o( d' a2 u& E
    要点
    4 D/ w, ~& k9 d1 E, A. n
    ) Y! a# z* e2 C( V+ L/ A; z1旋转图像现成的工具很多,一个是cv2提供的,主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图:& U8 Z" i' J& F* l$ x. S( w
    4 W5 s6 j) G3 ]/ x$ Q1 I

    6 q$ z1 D* L% e& b 3.png
    ' z; ?1 o6 K5 X; j) x  d7 ~' f5 H; K1 {. x
    这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。
    % S0 H5 c' ^7 T/ `# U8 k! n# w0 F( y6 S0 m. w+ G8 Z2 i3 j
    这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图
    ) J/ _& ~2 P$ Z9 _, k1 R$ ^  h6 h' C( M; Q2 V
    ) |- t3 d0 j8 h
    4.png 3 b- o6 Q- u8 i/ M( ?! I- R

    8 R5 b+ T6 f! |; I" o8 t代码#! /usr/bin/env python4 U! Y7 _- R: h3 v1 m/ R& j
    # -*- coding: utf-8 -*-+ w, i% {) W7 P6 M  f  A
    # ! python35 l& R6 P5 q3 p

    ; G: H7 O8 z( ~) b* Uimport cv2
    . z* Y& S8 |- g: V. Wimport numpy as np1 \6 z4 B, W% ], p) a
    from PIL import Image
    1 A/ s/ j) V4 u2 z  j* U* ]from matplotlib import pyplot as plt  R0 b% V9 H2 P
    import matplotlib.image as mpimg
    $ t# [8 S0 J4 ~- T5 R/ ]7 W
    " r: i: [- D/ |3 n4 Kdef rotate_image(url):
    ) N: R! X6 K, J% V/ ^8 p# p1 \        #旋转图像,并将其保存为4种角度的图片7 u, T( J- I$ @4 m2 v& R1 d
        im = Image.open(url,"r")0 Z$ L. i# E- S, S
        im = im.convert('RGB')  #避免有些图报错
    9 X" `7 X( P6 S" [    im.save('image_test/test_0.jpg')
    / I' Z( J7 ?3 l. D    im_90 = im.transpose(Image.ROTATE_90)+ o. I( z% z. O) [9 ~/ ~
        im_90.save('image_test/test_90.jpg')% [  @, y$ {+ L6 E$ y% F
        im_180 = im.transpose(Image.ROTATE_180)
    1 `$ L. |  K# L/ u: b    im_180.save('image_test/test_180.jpg')
    ' H7 I$ t$ K% i7 J    im_270 = im.transpose(Image.ROTATE_270)" f% f: W* S/ m: Q2 t$ W
        im_270.save('image_test/test_270.jpg')
    5 S: e8 m3 _4 g! P+ L, ~9 q! |: n0 c, @4 Z% `# g* H; \
    def plt_merge_img():
    ; @# m3 z5 Y' B7 v& O1 b        #将保存的四种角度的图片,叠加在同一张画布上$ Q) j) k! d% O1 A6 S: ]. m8 w
            #使用plt.figure()创建画布,并用add_axes()来分割区域显示图片$ R- w" B$ D8 g" r9 R5 A2 L
            #显示画布,并将其保存为fig_size.png) K+ {3 P( a: Q! P
        img1 = mpimg.imread('image_test/test_0.jpg')
    " M/ z7 M- K5 V4 {  P" Y    img2 = mpimg.imread('image_test/test_90.jpg'), s1 K. U0 ]2 y& y, F
        img3 = mpimg.imread('image_test/test_180.jpg')% P; x/ Y1 L$ i# g7 M, \
        img4 = mpimg.imread('image_test/test_270.jpg')
    " s7 b) p) R$ u' M4 u+ u# r    fig = plt.figure(figsize=(60,59),dpi=96)
    . n% W9 `1 M2 F6 Z" H9 p; ^3 ~( R, M1 a& Y" l& {
    #上方的横图
    , U9 b! }8 }& w5 E5 Z2 S, e    ax1 = fig.add_axes([0.30,0.55,0.42,0.28])
    # g/ C: I2 o, e% ?+ m0 k* f/ w    ax1.imshow(img1)7 z4 B' |) d) M" A9 B
        ax1.axis('off')
    - a8 P- H. q- A9 L: [5 @2 ^! j2 T3 Z. J# C7 G* [0 q. o0 o8 C" F
    # 右方的竖图
    , ^! H$ M/ S, }    ax4 = fig.add_axes([0.67, 0.29, 0.28, 0.42])
    ' l& r( G/ F. A    ax4.imshow(img4)
    # H& X. W' g* \" f# t1 y: j    ax4.axis('off')
    ; S: m- U: _$ i4 C/ x1 c, P9 E& U9 z$ d& o7 y
    # 下方的横图* A. v  p, r! Y/ W2 @3 f
        ax3 = fig.add_axes([0.30, 0.18, 0.42, 0.28])9 \& Y4 ~! {; v  s0 \0 R8 |3 e
        ax3.imshow(img3), Q6 M0 C- h, b1 ?* K/ p" K9 G# d! Y1 Z
        ax3.axis('off')( A3 H7 ]- I% R( }' D6 t
    0 c9 ^8 v% X' P" [4 j9 H8 R! E
    #左方的竖图
    - n! n* e$ i" o' I' B    ax2 = fig.add_axes([0.07, 0.29, 0.28, 0.42])! q% H- U- U. l9 X$ s7 y
        ax2.imshow(img2)) w; T' t& F# \  c, X
        ax2.axis('off'): i3 }* ~: f1 ^  {# q1 X5 Y1 n" J
        # 保存为sig_size.png
    + g! |: q2 Q5 f$ @- k. l    plt.savefig("fig_size.png",dpi=96)! E, |$ @. @. z
        plt.show()( O  H8 r, L" K2 H8 j

    3 p3 ~/ V4 |3 g: P. Sdef main():
    7 M  X6 ^3 V: J7 O/ {. ]# f% N* s+ V    url = 'test_1.jpg'
    # D( T& s$ \; R2 O9 `: e" _" V    rotate_image(url)
    $ i8 y& K+ A7 w  A( d+ |& b    plt_merge_img()8 ^" B5 d" }  @: A  s, M
    7 u5 _3 ?* `* a, A2 o' t
    if __name__ == '__main__':- q: D& B) o& w/ H. w  n/ \3 E
        import warnings
    0 x! w9 ]6 t; a& M8 K    warnings.filterwarnings("ignore")* z! E6 L7 |' s4 o$ p
        main()9 B( E# a3 B4 l4 G) N3 K

    3 V2 m5 P8 F6 C" G; f% i: B' A9 c————————————————' M& W, Q3 N, B0 S, R) h
    版权声明:本文为CSDN博主「你要啥自行车」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。% G# z* T) Y7 D' }: _5 G; u
    原文链接:https://blog.csdn.net/weixin_42572826/article/details/106033709
    . I2 g7 Q8 s) a1 b3 z+ e7 ?- s' l+ ~* f) }1 M' A2 F+ Z1 i
    / ^1 B( E/ U; a  T4 J1 Z

    * c) J1 ]' A+ [5 |, ^
    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 18:49 , Processed in 0.696153 second(s), 58 queries .

    回顶部