QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1611|回复: 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
    * [/ ^$ ?( G; n
    python4次旋转图片后,多图叠加显示0 T' N. `2 P2 `
    [color=rgba(0, 0, 0, 0.74902)]文章目录
      + C/ q3 v; A+ M6 X* n  I9 y2 [
      • 想要的效果对比,原图VS显示
      • 问题
      • 要点
      • 代码
        - l8 O/ i. h4 y8 h, r4 ^( r! L6 Y

    + b7 S7 y% j# a- ~
    9 n* J3 n  S/ a! b1 G; F* ~  V[color=rgba(0, 0, 0, 0.74902)]前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog- c6 J2 h9 L7 L0 q2 V0 M1 P, q
    想要的效果对比,原图VS显示 1.jpg 1.jpg ; f0 ^* l$ {+ \% x" I

    3 F- X; E; o7 s) I( k: S" Y! q/ o6 C
    问题6 u; b& C; p; w+ }* ?- m' j9 d

    $ p# H8 B. k6 T' o7 G(1)在刚写出来时,在rotate_image()函数中没有加,im = im.convert(‘RGB’)这句话,就会出现有的图正常,但是有的图报错,无法保存,并显示下面这句话
    + |6 P5 E0 G7 E: L5 Y! c# P5 |9 M4 v9 p
    这个问题可以在这一篇blog找到解决方法。就是im.read(url)后,再将图片转换为RGB格式(image.convert(‘RGB’))。这样就可以避免很多因图片导致的问题" a7 i5 j8 D, [

    7 ?' Z7 T& o9 w4 P( S# W4 y(2)在matlabplot中,显示图的第一步是创建画布,plt.figure(),然后在画布上添加子图,最后显示整个画布的图像时,并且让子图自适应来显示。而我遇到了这个就是关于self.figure.tight_layout()的警告,见下图。
    - [2 D  N1 m5 t  w
    + j  U  M$ }* w" ~  j) e一般在使用plt创建一个画布后,程序本身会有一个自动调整子图尺寸来使用画布的情况,但是因为我是显示图片,所以这个自适应就出问题了。但是还好,只是警告,不是报错,为了方便,忽略就好…(但是我不推荐这种做法,希望有人研究一下,并把解决问题告诉我)
    ) j0 W9 s1 b+ x5 g! U为了方便,我直接在一开始加上下面这句,忽略掉。3 W" u0 k! X3 n9 U
    import warnings- ], f/ K5 t) ^$ `' M
    warnings.filterwarnings("ignore")7 A1 H& U' B3 M- Q

    * }, W2 @6 f& J* H3 U要点: P- s2 x4 U0 u" h1 Q6 u2 b, B
    1 \5 Z' ~7 l! N
    1旋转图像现成的工具很多,一个是cv2提供的,主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图:
    . C& ?9 w. n# C9 l& t1 `' i$ I% S  \" a4 p3 k5 h

    6 P9 Y  k  E$ {, U- \ 3.png ) i" l. `, }: Y! y+ r8 Y
    1 b2 p* h+ P, C: W2 V, E+ D$ |
    这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。1 A/ X9 b1 _2 V5 n2 C0 `4 U
    ! F3 g* N6 M' v0 |+ |3 P/ \2 Y
    这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图# G! u! E$ `3 p. ~  T: H
    / p, m& \0 N/ S7 i

    / e7 F* Z; L2 {2 W4 | 4.png
    - ?! \2 ^+ E! l
    $ Q7 A1 _; W  ?9 D0 C; f! W代码#! /usr/bin/env python; f1 o! u8 K7 w4 |; U* b
    # -*- coding: utf-8 -*-, @) c* f+ R) G% O, i
    # ! python38 x, u" T/ h4 d( U; y0 f' y* n

    . a# r: Y3 T- U: R( a4 g8 K( Bimport cv2
    - m1 t1 B* T" F& Mimport numpy as np4 t3 z9 c( m" H; }4 q1 b- @
    from PIL import Image' y7 L5 U# @; q/ U' K$ ~+ E
    from matplotlib import pyplot as plt3 K0 q$ y7 w! q  l7 l& t( r% [% G
    import matplotlib.image as mpimg
    ; p% _, z+ m3 ?2 _9 p' S, w8 o6 y9 y; h& k1 E! m/ U
    def rotate_image(url):
    9 N- }' ]% y" H6 e        #旋转图像,并将其保存为4种角度的图片
    & F, f: S7 V/ Y; B4 o1 @    im = Image.open(url,"r")- w# k" S' J4 C3 v5 N/ l4 Q( S; n1 U
        im = im.convert('RGB')  #避免有些图报错 9 H, D$ N2 t4 m; n- M" }% C! s9 u
        im.save('image_test/test_0.jpg'); _- S/ {  T" Y
        im_90 = im.transpose(Image.ROTATE_90)& j( u& j  i+ D  z( z9 `$ I% s9 s
        im_90.save('image_test/test_90.jpg')
    0 P; Y! j# o% ]+ I* B" Y# c+ ^    im_180 = im.transpose(Image.ROTATE_180)# d: I" a2 S! A( X, a
        im_180.save('image_test/test_180.jpg')
    + c' c+ g' X- M. s* }' j# M    im_270 = im.transpose(Image.ROTATE_270)+ r" t; M" }3 ]
        im_270.save('image_test/test_270.jpg')6 B# V$ m" X- o; K  a

    $ Q  e/ G3 f! S+ D: Z1 q, `; Ndef plt_merge_img():
    ) y+ S, S0 V% K* ]2 ]# L        #将保存的四种角度的图片,叠加在同一张画布上7 p) l  |0 M3 s$ |! z5 |
            #使用plt.figure()创建画布,并用add_axes()来分割区域显示图片
    $ a$ Q0 H- P# Z- j$ J' J        #显示画布,并将其保存为fig_size.png" `1 A. [$ u7 o; y. Y, x* O
        img1 = mpimg.imread('image_test/test_0.jpg')
    - w2 w# ~; Q% Z    img2 = mpimg.imread('image_test/test_90.jpg')
    5 p0 T: z" l3 T+ g* r  R' {    img3 = mpimg.imread('image_test/test_180.jpg')
    - T9 E. L7 N+ ]; ^3 {; e# E4 G    img4 = mpimg.imread('image_test/test_270.jpg')3 {- k/ ^/ K, C, M! x: }7 Y# J
        fig = plt.figure(figsize=(60,59),dpi=96)0 G9 @4 A" l2 N" V

    4 _5 R3 z4 |/ P) I#上方的横图2 C! [. [; }$ o: p% b) z% X* H: ^2 o
        ax1 = fig.add_axes([0.30,0.55,0.42,0.28])9 }4 x5 ]5 P, p" y" B% H
        ax1.imshow(img1)
    9 \+ P$ ~" S5 g  [' @. e7 Y    ax1.axis('off')7 \2 j8 k6 @7 H# \
    / ^/ \; D4 d; N5 O% E6 ?; H- C! _; h/ e
    # 右方的竖图
    9 L1 j' W7 V3 f7 m    ax4 = fig.add_axes([0.67, 0.29, 0.28, 0.42])* \. o8 d* J4 }9 L
        ax4.imshow(img4)3 G5 e+ X7 s4 J6 p3 i1 _) H
        ax4.axis('off'), n' i6 _3 P) [' b" H. ?# a- b) w) T

    2 o1 z4 w. b  |8 a" v4 u2 e# 下方的横图
    9 Y/ N( S* R. K! {1 c    ax3 = fig.add_axes([0.30, 0.18, 0.42, 0.28])3 r; x/ d% A: R4 R
        ax3.imshow(img3)! R8 d8 x: |- s; K4 U
        ax3.axis('off'). e% j% P7 e( c+ M& r5 i% f+ }
    0 D7 q' ^% |1 V0 E3 C- T- v4 s; H5 }
    #左方的竖图+ V; R; P; q  ]- s3 z
        ax2 = fig.add_axes([0.07, 0.29, 0.28, 0.42])3 u  R' `6 y' F! v, _; c' ?% N+ ^( A
        ax2.imshow(img2)
      K( n# [9 }+ x/ F( e0 W7 h4 c7 D7 D    ax2.axis('off'), \% Q( a9 A. N% w/ E! O
        # 保存为sig_size.png
    7 W+ p, e) M# U, k* ~    plt.savefig("fig_size.png",dpi=96); s# l6 ]2 r# |0 ]- }: j+ G0 D8 N
        plt.show()
    & s. G0 I; L. ~: |
    ! P' S- A; G4 C, D4 t. I6 X- H3 R# mdef main():% k" L, g# M$ Q# X* z/ G1 s
        url = 'test_1.jpg'7 p4 j, n* A- {  V! }! N& A
        rotate_image(url)
    * ]& q" o9 e  E, m$ B) r" U2 z7 U    plt_merge_img()
    * }7 w$ d" w7 R; I  n' b3 D+ r9 z, j4 S! K; e" l- A
    if __name__ == '__main__':
    . k- d! [4 K1 F! N) Q0 C    import warnings
    . W+ @* l: o3 a- J% B    warnings.filterwarnings("ignore")
    ! i( x8 ]- j6 Y5 L: F    main()2 w3 q6 R: c, U) |) x+ k# x, R; m: [3 ?
    5 e9 Z7 M$ _- C" F3 l' F
    ————————————————
    # x( M( }( E6 G/ x& C版权声明:本文为CSDN博主「你要啥自行车」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    , b$ b& F1 I' V原文链接:https://blog.csdn.net/weixin_42572826/article/details/106033709
    / G& ~, U& m" N* B
    ' i2 t: N# ?& \* j' D7 y* a: w+ N4 x2 V* g
      R1 Z4 h, l0 ~+ m9 M
    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 20:30 , Processed in 0.346863 second(s), 59 queries .

    回顶部