QQ登录

只需要一步,快速开始

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

    ' n% \+ Z  E0 v/ hpython4次旋转图片后,多图叠加显示
    - \5 I& T% J/ W[color=rgba(0, 0, 0, 0.74902)]文章目录

      9 o- {" G; w, y/ G
      • 想要的效果对比,原图VS显示
      • 问题
      • 要点
      • 代码/ E6 N  M7 c2 w
    + p8 [  \, Q* Y7 b" W& G. m( z- G

    ' S. v$ \( v1 t$ D$ g& z% U# S  Q[color=rgba(0, 0, 0, 0.74902)]前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog( x) \! l/ w" f9 {$ }9 L( y  Z* G. @8 E
    想要的效果对比,原图VS显示 1.jpg 1.jpg
    3 y6 ~4 L' Y5 i8 n8 o* f" J9 z. z* z; K

    . K' ?8 @7 [2 w, T: t2 }; a& Q9 o+ g问题0 w+ i# d  M0 H. j6 w

    2 F% a3 k# o+ s( W4 H5 f) B(1)在刚写出来时,在rotate_image()函数中没有加,im = im.convert(‘RGB’)这句话,就会出现有的图正常,但是有的图报错,无法保存,并显示下面这句话
    6 C  w6 f% x2 U+ S7 Y! _+ T' i
    ; B% w  b/ B& m+ Z  R( _这个问题可以在这一篇blog找到解决方法。就是im.read(url)后,再将图片转换为RGB格式(image.convert(‘RGB’))。这样就可以避免很多因图片导致的问题
    - k1 }, l1 P$ U7 o; Q# m6 ?1 _3 O% a: `& Z3 F1 ?. B
    (2)在matlabplot中,显示图的第一步是创建画布,plt.figure(),然后在画布上添加子图,最后显示整个画布的图像时,并且让子图自适应来显示。而我遇到了这个就是关于self.figure.tight_layout()的警告,见下图。2 x' e  s6 j4 X7 {% d

    ' }0 i' B& q' C; y4 k" r. L一般在使用plt创建一个画布后,程序本身会有一个自动调整子图尺寸来使用画布的情况,但是因为我是显示图片,所以这个自适应就出问题了。但是还好,只是警告,不是报错,为了方便,忽略就好…(但是我不推荐这种做法,希望有人研究一下,并把解决问题告诉我)
    1 x6 _! I3 Y) z为了方便,我直接在一开始加上下面这句,忽略掉。
    5 g9 w, _5 B. O' S+ D& x; Jimport warnings1 L* f; i1 ]  s, }3 s( `9 e. N* \
    warnings.filterwarnings("ignore")
    . r% o( D5 ~3 F3 u% K# U+ T
    ( e7 M0 k+ z$ r! @% H/ Q' Z要点
    1 S5 O: d# W- f, S( o) h1 u& z1 F( R( |
    1旋转图像现成的工具很多,一个是cv2提供的,主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图:7 ?+ n( K0 E- M/ G5 K; J, s) o

    9 p7 k( g% ~  ~% L
    ( o8 y9 D# ]- W# M* U$ D 3.png
    5 Y/ ?' o  N8 h' ~. q2 N( I2 l) Q0 F. V; A
    这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。4 k, q* N7 W# O+ v# V. M
    # M& R' F! M; x; {; L1 f
    这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图" C9 H: i) k& R7 e  g6 H
    * J. N5 c1 B9 ?6 T" V* m, ^" M
    # @7 D! ~# j) p1 U) B; T; l
    4.png
    * i% O* u2 o7 ~  T3 B
    % A: [9 |9 s) l6 K# N  l1 ~( M. N代码#! /usr/bin/env python
    , e6 x. ~6 ~' a3 r+ T& [3 r# -*- coding: utf-8 -*-
    * [4 {' O5 ?9 n" c* S# ! python3
    5 _4 D# E' Q! F+ o% @: i) P
    ( {: m2 ]' P5 |/ Z6 {* [5 |, timport cv2/ `% t& f$ q/ g" @
    import numpy as np1 ^5 S+ N& v& Z7 i4 ]
    from PIL import Image- c) V& k& @8 @
    from matplotlib import pyplot as plt. L3 t! n3 `  ~' K8 c
    import matplotlib.image as mpimg
    , T+ j+ P% b; G
    $ [  a( r$ N# J$ [def rotate_image(url):% `- _8 k9 |! L. b5 E- @
            #旋转图像,并将其保存为4种角度的图片
    6 T4 _5 f  }4 u- @    im = Image.open(url,"r")
    : |: n/ b( _' g- o+ Y9 o) e    im = im.convert('RGB')  #避免有些图报错 4 c4 b, e& w0 G( t. }
        im.save('image_test/test_0.jpg')  a; N. F$ m. |  A
        im_90 = im.transpose(Image.ROTATE_90)
    ) k2 A( q  m0 l- U. X% ?, y4 I    im_90.save('image_test/test_90.jpg')# y$ L" d; p/ G. N
        im_180 = im.transpose(Image.ROTATE_180)
    - q8 q& y, m$ ~, h: O    im_180.save('image_test/test_180.jpg')
    # h5 V" J0 J0 @  b- V    im_270 = im.transpose(Image.ROTATE_270)
    - o- G6 G* p% `8 r7 y- H* K    im_270.save('image_test/test_270.jpg')
    $ u: v9 B2 C, `9 I8 G3 ~* n+ q9 t
    # R' z$ G& I5 z2 b/ K- s' adef plt_merge_img():+ E  {# Y! G3 B) S" X, Q. H3 B
            #将保存的四种角度的图片,叠加在同一张画布上
    * r1 A4 T: D& Z5 d2 V        #使用plt.figure()创建画布,并用add_axes()来分割区域显示图片
    9 k( |+ z! W5 z4 ^+ L        #显示画布,并将其保存为fig_size.png0 _$ e& z7 Q2 K5 |6 d0 j5 O
        img1 = mpimg.imread('image_test/test_0.jpg')
    6 F+ v% K& _. b8 G& u, F    img2 = mpimg.imread('image_test/test_90.jpg')
    4 u1 E: |8 R/ ?# W4 M+ ^$ L) \    img3 = mpimg.imread('image_test/test_180.jpg'): V* v3 ~0 [" m" q7 I
        img4 = mpimg.imread('image_test/test_270.jpg')  p- _7 x1 G1 t4 _% u
        fig = plt.figure(figsize=(60,59),dpi=96)9 t0 R/ p% V7 R3 E
    4 y* O  k9 M  f2 b. }; \; }
    #上方的横图
    3 [  z5 d' ~6 m4 s" g4 v    ax1 = fig.add_axes([0.30,0.55,0.42,0.28])  g0 t  K/ _, V- k; t" W
        ax1.imshow(img1)
    3 X& w$ M  \3 ?% `/ t) R( x    ax1.axis('off')
    ) O8 W2 w2 f8 N' {& y7 ?) k; R. c% V1 F% I9 h' ^
    # 右方的竖图
    / ?6 S: ]6 h8 }    ax4 = fig.add_axes([0.67, 0.29, 0.28, 0.42]): j! J9 N4 [- H% c, l$ x% l: q- ]
        ax4.imshow(img4)
    $ }) V+ X9 U- W1 u$ E. c' u    ax4.axis('off')
    - z! A+ S. B3 D
    & ?5 [) |. n2 |" U# 下方的横图
    $ H8 y# L3 `4 v* Q. t9 y; Y    ax3 = fig.add_axes([0.30, 0.18, 0.42, 0.28])8 a# G7 y( {" l- B- N
        ax3.imshow(img3)
    % L" D& F8 j" k9 U8 i% J& ?  }    ax3.axis('off')
    $ @0 ^2 K- _# T) }3 I0 o3 [9 u9 ]1 X
    #左方的竖图
    2 _; e2 k$ A4 b4 ^% v9 q! n    ax2 = fig.add_axes([0.07, 0.29, 0.28, 0.42])$ c( Y$ T& f; V- k0 d
        ax2.imshow(img2)
    ) T3 @7 C" y/ z( b2 ^: Q6 H    ax2.axis('off')
    % C; ?, b) i7 }5 N# f4 y    # 保存为sig_size.png: F+ g* r5 ?0 l; d, d. U9 y2 f, U, ^/ }( V
        plt.savefig("fig_size.png",dpi=96)
    " S" s- F4 }% Q( U    plt.show()
    ( k# P2 a: X3 B
    - b- @0 @+ r: [- u. Zdef main():: t$ l- P; G( x! p3 Y8 c/ n/ B
        url = 'test_1.jpg'
    : H6 F$ `  C2 G' c6 _: Y# j    rotate_image(url): Z6 {  a: ]# Y/ k: t' h/ @5 `
        plt_merge_img()6 n6 Z* y: T6 C$ {
    % z& \. Z, b% B: y! W" I! J& Z1 ~
    if __name__ == '__main__':
    4 n0 Y0 Y, J7 t& t# c& P8 s    import warnings7 a* k5 V) \  f+ Q/ ?7 x6 n) j
        warnings.filterwarnings("ignore")
    5 X, ]2 G- t6 d7 Y    main()
      w+ d, }9 E3 r7 Y4 V1 s) D7 s+ ^7 l: y* U" E
    ————————————————
    9 E1 q# [' }! W, W- F9 [' a! Z版权声明:本文为CSDN博主「你要啥自行车」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。: D0 l# W4 o$ s5 O
    原文链接:https://blog.csdn.net/weixin_42572826/article/details/1060337098 ]8 I8 \% F+ Y9 y) k/ o
    4 w" `# h, e1 o

    9 k" ]7 U' E$ d& x  a% n9 G$ |
    # ~' C& k) ]7 {" [
    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-14 17:06 , Processed in 0.439726 second(s), 59 queries .

    回顶部