QQ登录

只需要一步,快速开始

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

    " ^2 }: V( ~& }" j# b0 A% i$ ^python4次旋转图片后,多图叠加显示
    . A0 i& A, ^4 l" ][color=rgba(0, 0, 0, 0.74902)]文章目录
      * Q* K5 _$ x+ j8 T+ i. d" B
      • 想要的效果对比,原图VS显示
      • 问题
      • 要点
      • 代码
        ( z3 y0 \% D$ Z

    : s6 f  g; v# ]8 X( g* Q# ?6 r' B5 Q: Y4 }
    [color=rgba(0, 0, 0, 0.74902)]前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog2 k& `" T/ a2 t( n  n
    想要的效果对比,原图VS显示 1.jpg 1.jpg / y% f6 D9 u6 E+ q1 V/ O4 N. X

    % e: h0 d4 F& J1 o5 M8 M) m! F) i, J/ b* F( X+ F) X* X1 n, G
    问题
      W( [/ z8 v1 i( A$ n! F
    ) d& J# U6 d* f* w% U3 L" U, A, A; I(1)在刚写出来时,在rotate_image()函数中没有加,im = im.convert(‘RGB’)这句话,就会出现有的图正常,但是有的图报错,无法保存,并显示下面这句话
    4 `8 T: g/ X$ \3 Z$ J0 S  _8 _4 r" v. P$ M2 ]5 r+ L0 T
    这个问题可以在这一篇blog找到解决方法。就是im.read(url)后,再将图片转换为RGB格式(image.convert(‘RGB’))。这样就可以避免很多因图片导致的问题
    2 `$ y' n7 U" u( Y  ^2 x+ M1 D$ J& J% w% x0 p% R. U
    (2)在matlabplot中,显示图的第一步是创建画布,plt.figure(),然后在画布上添加子图,最后显示整个画布的图像时,并且让子图自适应来显示。而我遇到了这个就是关于self.figure.tight_layout()的警告,见下图。' E5 R0 w$ g% V# Y

    $ K( Y# X% A. @" Y( J! ^5 ]/ Z5 c0 I一般在使用plt创建一个画布后,程序本身会有一个自动调整子图尺寸来使用画布的情况,但是因为我是显示图片,所以这个自适应就出问题了。但是还好,只是警告,不是报错,为了方便,忽略就好…(但是我不推荐这种做法,希望有人研究一下,并把解决问题告诉我)4 v" v9 Q; f7 t" r
    为了方便,我直接在一开始加上下面这句,忽略掉。
    # O6 S, x* G$ o( Q4 @, `import warnings  e6 `: U7 b) O1 q8 ^& h7 `3 {  `
    warnings.filterwarnings("ignore")3 a7 M, K" U, ]# k% a/ P

    " V% ]% W3 z$ k6 z8 g! s要点
    % z( G. V1 v4 T! u8 [' v. N' M6 o
    . L! \5 N+ _2 g; C* G# Q8 N5 C( l1旋转图像现成的工具很多,一个是cv2提供的,主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图:2 f1 d  D  N. r& W! o6 X

    ; ]8 i; i5 p! x( P  w! d7 X7 s  w( Y! w8 o# g6 u: W
    3.png
    & [. ^5 H( N6 I, q/ p4 ~* a. s- [" o5 \3 v2 ~  m& Y
    这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。8 u6 F$ i: E6 [$ M& L

    - i- L, ?+ E! ?这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图
    1 b7 I) r! _+ ]; g
    6 N, O  F, E* ~% I$ K- S
    2 G) p/ r4 i  J" V) w 4.png
    " z- ?2 n6 L& D! j) f3 n7 F. P9 O1 c- q1 M2 f- ~
    代码#! /usr/bin/env python
    7 W/ l7 y, G, l# -*- coding: utf-8 -*-- n9 @2 c+ V4 {, N
    # ! python3
    $ C- r& P+ G6 \3 G$ T/ h8 L
    . t# l4 T7 i; w+ |4 f) H) Oimport cv2
    $ h$ o, D% o9 b# ?8 r$ qimport numpy as np. F- ^" V, R( u( y& a) a7 t* m
    from PIL import Image$ @6 W8 N7 J7 V7 x
    from matplotlib import pyplot as plt
    5 A6 {. Q1 ?2 r. ^import matplotlib.image as mpimg
    7 n/ S% J; k9 ]7 w& D9 A# x' V3 J9 `
    def rotate_image(url):* O2 ^( X/ e8 q& B& C& u
            #旋转图像,并将其保存为4种角度的图片7 h1 T; x: y5 L! X2 c
        im = Image.open(url,"r")
    1 J* m6 V6 ~7 ^5 Q% _3 u    im = im.convert('RGB')  #避免有些图报错 4 B& ]& R* Q6 C5 r
        im.save('image_test/test_0.jpg')
    0 Q* P3 v# F3 J3 E    im_90 = im.transpose(Image.ROTATE_90)9 R6 B! @4 x1 ~# A' i/ l& q; F7 T$ n2 [
        im_90.save('image_test/test_90.jpg')5 R3 O! d/ Z; d1 M1 X, t
        im_180 = im.transpose(Image.ROTATE_180)
    # i# Q  I9 k) c2 a    im_180.save('image_test/test_180.jpg')
    6 c6 h# r, H! @4 S' _    im_270 = im.transpose(Image.ROTATE_270)! l9 l4 Y! |2 w5 J" t
        im_270.save('image_test/test_270.jpg')
    $ J8 h) A) g$ @3 f& O+ k  f0 x! Y6 V2 c# m  W0 V1 }+ t
    def plt_merge_img():
    ! U6 H$ g2 p2 Z- s% ]- U        #将保存的四种角度的图片,叠加在同一张画布上
    9 j1 M& v2 Z1 X0 D/ l        #使用plt.figure()创建画布,并用add_axes()来分割区域显示图片1 Z) S: Z4 Q) l; v5 W/ t
            #显示画布,并将其保存为fig_size.png
    ; d5 v" V: O+ Y3 Z    img1 = mpimg.imread('image_test/test_0.jpg')
    * r# _& J2 K+ O    img2 = mpimg.imread('image_test/test_90.jpg')
      ?0 Y* L4 n9 Q# t8 ~; Q    img3 = mpimg.imread('image_test/test_180.jpg')
    0 r* [* x# C: _8 w- g    img4 = mpimg.imread('image_test/test_270.jpg')
    $ u/ [. }1 f8 C/ i    fig = plt.figure(figsize=(60,59),dpi=96)7 G! Z$ c+ f3 d( K
    1 e" L" c$ [' H" P) Z
    #上方的横图" Q3 i9 U. k3 P' \
        ax1 = fig.add_axes([0.30,0.55,0.42,0.28])8 U) @7 @" q* y5 x4 Y3 ~$ t
        ax1.imshow(img1)
    + i1 r: J8 u& x    ax1.axis('off')" k% F) T8 X6 [" j' g4 ?+ H8 u- l

    $ `: _" Z: O5 g8 E# 右方的竖图- @' l. r2 l& o
        ax4 = fig.add_axes([0.67, 0.29, 0.28, 0.42])
    ; L4 P) \; I' }2 f5 `5 o" ^    ax4.imshow(img4)
    - g8 e! M& Z9 M$ e8 r    ax4.axis('off')
    8 A* i8 M" I' [& s
      d/ S# T. D: g) L# 下方的横图
    - R" H/ r) k2 s" ^3 C8 s    ax3 = fig.add_axes([0.30, 0.18, 0.42, 0.28])& o, N/ G( K6 s6 G" o( C! T
        ax3.imshow(img3)
    " g' c) D' N1 J+ ]: C! h  u% U# `    ax3.axis('off')* n1 R$ c* B2 t5 M
    2 l; v# M7 z) g
    #左方的竖图
    5 m) u! M4 S+ _- \    ax2 = fig.add_axes([0.07, 0.29, 0.28, 0.42])
    3 J* }& @6 q% D! K    ax2.imshow(img2): p0 |4 `; @  e9 _
        ax2.axis('off')  c% Y9 r( l* m6 M4 D5 T* U
        # 保存为sig_size.png
    3 P8 W7 P* `, K/ F    plt.savefig("fig_size.png",dpi=96)& M' u9 U! L7 A1 `  y3 F
        plt.show()
    * p0 i6 _' J) t: U0 }" X/ C5 Z; ^  k1 w; o0 K- m
    def main():
    + O# {- A: Z. w- K& T    url = 'test_1.jpg'
    ' ]8 I; u* r) H8 h    rotate_image(url)
    * i- |7 a. I0 P# N/ L6 F5 z1 @9 a    plt_merge_img()
    # ^5 _2 ^# n1 G
    0 F" m" o" u' X, J+ i1 nif __name__ == '__main__':2 E" j5 |. w- [1 ~1 x
        import warnings. m. Q- O- s. S; n6 M* \% R
        warnings.filterwarnings("ignore")
    ' q5 k& M# h3 f7 Z8 j    main()& k9 N2 h9 d$ p- \7 `

    : J/ j3 H+ [; ]. B( q( M————————————————
    ! S7 T6 U. c. M( x版权声明:本文为CSDN博主「你要啥自行车」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    $ f# M3 h# a% }原文链接:https://blog.csdn.net/weixin_42572826/article/details/106033709
    - }- J, P4 s- g% t. ?9 i! ^9 \/ D; v

    3 F7 s3 M3 a1 r* C& Y" G" a0 F! t- W' V+ l; j9 b5 R
    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 17:39 , Processed in 0.470685 second(s), 58 queries .

    回顶部