QQ登录

只需要一步,快速开始

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

    ) o- x4 S7 i, z3 [python4次旋转图片后,多图叠加显示; U, |# j* M+ Q- N4 Z& @# a" E
    [color=rgba(0, 0, 0, 0.74902)]文章目录
      # V: v( w9 w1 R- }$ k& e7 @8 Z4 r
      • 想要的效果对比,原图VS显示
      • 问题
      • 要点
      • 代码2 k, Q5 f  ~7 Q# v
    - \# G. W, C* Z) x' i3 T/ r
    " j6 u* [: a" Y+ @6 O
    [color=rgba(0, 0, 0, 0.74902)]前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog' b5 B9 l7 K( _+ E3 A9 M! r
    想要的效果对比,原图VS显示 1.jpg 1.jpg
    : t2 Y+ E1 V# c( Z. T& @
    * g: I' V% E  K7 K& u: l3 y  ]* x; p
    2 L: @9 w5 p; v# D: @问题% v. K1 u& m3 t* t5 b: w

    " M6 T+ O9 v2 z+ b" Z(1)在刚写出来时,在rotate_image()函数中没有加,im = im.convert(‘RGB’)这句话,就会出现有的图正常,但是有的图报错,无法保存,并显示下面这句话
    * e# b( o- o" a  `0 e3 A* R, f' j" a8 A4 S# O! r  O
    这个问题可以在这一篇blog找到解决方法。就是im.read(url)后,再将图片转换为RGB格式(image.convert(‘RGB’))。这样就可以避免很多因图片导致的问题, m7 U' p) M2 |+ G( P- O

    ) ]+ l% T9 V8 M3 c2 z(2)在matlabplot中,显示图的第一步是创建画布,plt.figure(),然后在画布上添加子图,最后显示整个画布的图像时,并且让子图自适应来显示。而我遇到了这个就是关于self.figure.tight_layout()的警告,见下图。. f( O' D7 k+ D0 J, _2 A1 X7 r

    / R  K  D+ a: B' ]1 }一般在使用plt创建一个画布后,程序本身会有一个自动调整子图尺寸来使用画布的情况,但是因为我是显示图片,所以这个自适应就出问题了。但是还好,只是警告,不是报错,为了方便,忽略就好…(但是我不推荐这种做法,希望有人研究一下,并把解决问题告诉我)
    8 b+ ^" K: ]5 s  M. I为了方便,我直接在一开始加上下面这句,忽略掉。* P( h& f8 s+ ]
    import warnings- U1 Z; u8 d8 e3 x  a4 S
    warnings.filterwarnings("ignore")' u* U% e) \0 u) C: Y0 o, i; s
      O) \4 u9 y7 d5 K3 n
    要点
      x9 w# \; P9 J/ G9 y; r8 G7 X6 ^- b
    # l" C# w  A% t. V. A1旋转图像现成的工具很多,一个是cv2提供的,主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图:2 q9 K* P: B  }+ q" }

    5 Q/ Q+ I- r2 e8 V/ N3 Y5 g
    % }/ H- n! w; A, ~+ q2 `( l. v 3.png ) T6 U% D7 E: ~8 |6 z: j& V' d

    2 S& R( N9 `/ M' }: }/ Z# ^这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。+ c) W# a* |0 N9 Z

    6 s: v/ H+ k! h) J# Q, y这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图
    8 B' n' w; b$ Q) w5 X& z: E% s- b$ l4 b6 Q, X& v
    / J: u7 V. y: e. x# x
    4.png
    0 k3 \* @  G# {0 Q9 J6 s# |. {' l
    代码#! /usr/bin/env python
    3 E0 i$ O, _" m' m. W0 K# -*- coding: utf-8 -*-
    ' y; J" n  f( h' `/ }0 w. o# ! python3
    ( L- m; R1 ~2 w1 D8 N1 B, e+ q5 X/ H9 m1 U
    import cv2& J& Z4 x1 X$ `3 H) y- k9 c, [
    import numpy as np, u* Q5 M9 `8 F0 N0 D  Q4 ?
    from PIL import Image
    1 `2 j2 W0 m; W0 Q# Efrom matplotlib import pyplot as plt: t1 E/ i- q. Q* d, A
    import matplotlib.image as mpimg
    - F4 L. {' i  ~3 K( z
    ! B6 p2 c. q- x* Z" qdef rotate_image(url):" g  v% [( ^  k$ [( b
            #旋转图像,并将其保存为4种角度的图片
    * |1 M5 f  g9 ]1 @5 W0 q5 `    im = Image.open(url,"r")
    ; {' [5 u" ?* E: K+ Y2 W) N8 a    im = im.convert('RGB')  #避免有些图报错
    ' z/ P' P2 M+ z% I    im.save('image_test/test_0.jpg')
    & {6 `) ], j7 m' f    im_90 = im.transpose(Image.ROTATE_90); j. c- T3 I) k  B
        im_90.save('image_test/test_90.jpg')1 H- T- y8 V2 P' u* r
        im_180 = im.transpose(Image.ROTATE_180)0 r6 T$ ?! b# E& k+ S2 }7 D! i; P
        im_180.save('image_test/test_180.jpg')
    6 ]" @% n+ T3 l" {" A# |    im_270 = im.transpose(Image.ROTATE_270)
    4 i7 u. D4 O% b6 h$ H2 `; a    im_270.save('image_test/test_270.jpg')  ]! O/ N9 A' U& ^4 y0 C  `
    : i& W! m" w% ?% U0 H$ S( X
    def plt_merge_img():
    2 [9 f1 I! p8 E+ V1 x1 I        #将保存的四种角度的图片,叠加在同一张画布上7 ]1 s7 q7 \+ y0 A# |: V& v
            #使用plt.figure()创建画布,并用add_axes()来分割区域显示图片
    $ |& K3 E! z0 Q% {        #显示画布,并将其保存为fig_size.png
    . b+ {, P; x9 q! M. J    img1 = mpimg.imread('image_test/test_0.jpg')* y  l$ O! f; H* B
        img2 = mpimg.imread('image_test/test_90.jpg')
    ) n+ r3 @& i: u7 \* b  `    img3 = mpimg.imread('image_test/test_180.jpg')( n9 [, E6 U5 q, n" B& }
        img4 = mpimg.imread('image_test/test_270.jpg')
    ) Z8 X) o, a$ Q7 ~    fig = plt.figure(figsize=(60,59),dpi=96)% d% S- ?" L: {5 M0 [

    # s! \# Y0 i- ]% g$ i( f0 m#上方的横图
    " d3 F/ g" T8 o; ^/ v2 j% [/ M    ax1 = fig.add_axes([0.30,0.55,0.42,0.28])
    ( ^  Y# |) x( K, {" \- `    ax1.imshow(img1)
    & J0 ~& B- p% e# p    ax1.axis('off')
    0 w7 J$ u' _( Z& ]/ W
    ; f& E' n+ ~. M8 D: c: g# g& A# 右方的竖图
    3 E+ ^0 W& Q2 f/ `" r! i    ax4 = fig.add_axes([0.67, 0.29, 0.28, 0.42])
    $ m( g8 e  B: a& y% P' L, V    ax4.imshow(img4)
    ( i/ o/ \, B( [4 d. W2 `    ax4.axis('off'); a' A! l3 z/ r3 \. L2 v8 k
    % A( y8 [% J2 d8 u2 u
    # 下方的横图. J6 H6 {' l/ _
        ax3 = fig.add_axes([0.30, 0.18, 0.42, 0.28])
    5 N, e' B5 x/ C0 Q9 i3 }+ N2 i    ax3.imshow(img3)
    ' A: I" y( I( W0 ]& `' a1 k% G9 i    ax3.axis('off')
    % Q$ o" W/ i. v5 k! ^3 Z( j
    1 E4 f; g3 G5 Y4 b#左方的竖图$ s3 g2 u. ~6 z1 D
        ax2 = fig.add_axes([0.07, 0.29, 0.28, 0.42])
    + E$ n( F  T: X2 r0 K    ax2.imshow(img2)0 E, g) w. m0 T. P5 a9 [, {
        ax2.axis('off')
    7 f$ r7 J0 t$ s8 n! u; U& X    # 保存为sig_size.png. T- D; I9 a4 E0 r5 V1 J
        plt.savefig("fig_size.png",dpi=96)
    , J1 R/ K, e- G$ E% T4 g4 r9 R( u    plt.show()6 x; `# F3 f4 N+ z5 c2 R) q
    2 J: d, c% H; [6 h
    def main():: M4 o  [8 ~' x" V. |
        url = 'test_1.jpg'/ T" o4 [  l2 w% I4 ^
        rotate_image(url)* k+ z- C2 h. {6 g* m: e
        plt_merge_img()
    2 \7 E  `5 i2 l; R8 w( A0 C# g) G( W% B# }" J5 V
    if __name__ == '__main__':
    - ~. I' w/ t6 S+ i# v' j0 q" r    import warnings! y% Y$ K0 H; q. s0 j; N; q
        warnings.filterwarnings("ignore"). R" b% W  j% r: ^9 B
        main()5 t+ V8 G  N' o

    , V# M8 f, v, o2 d" Z————————————————
    , U2 @! R) {# m+ j* z" S& r1 x9 R4 C版权声明:本文为CSDN博主「你要啥自行车」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    / I1 w4 Q' V, o  Q7 c, w8 P- R原文链接:https://blog.csdn.net/weixin_42572826/article/details/106033709* L! j/ y5 `  I  `

    7 X( y" h- m) m% H) }  g% H$ I4 R. P- ~2 Y% W

    ; X$ K% E: w2 I
    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-21 20:29 , Processed in 2.930008 second(s), 59 queries .

    回顶部