QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1442|回复: 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
    : @/ E! P  p+ \( A6 q) V4 |+ {! B4 J
    python4次旋转图片后,多图叠加显示
    ( v2 V6 K1 D0 ]3 Y2 q+ e7 ~[color=rgba(0, 0, 0, 0.74902)]文章目录
      + o' y1 y5 }. |2 c* n
      • 想要的效果对比,原图VS显示
      • 问题
      • 要点
      • 代码3 ]0 y9 w( B1 Q& G$ Y: B% @8 c

      }9 M! Q5 s7 H* e) A( v' d8 h: _4 e7 Y" D( f5 D9 n, H# W- j
    [color=rgba(0, 0, 0, 0.74902)]前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog
    2 R2 \- V& ?2 C0 u. ?想要的效果对比,原图VS显示 1.jpg 1.jpg
    5 }; S. [) u* o- }- W/ Q
    % N( I% x7 J  P: h' t0 T3 W- n3 Y5 i1 j3 j3 z
    问题6 U; {# ]% q& a7 ^- C' a, }5 `
    , H; M0 X( I* ~( o
    (1)在刚写出来时,在rotate_image()函数中没有加,im = im.convert(‘RGB’)这句话,就会出现有的图正常,但是有的图报错,无法保存,并显示下面这句话& b( s* y; v3 v- H4 H

      \. G9 V& V5 y9 p这个问题可以在这一篇blog找到解决方法。就是im.read(url)后,再将图片转换为RGB格式(image.convert(‘RGB’))。这样就可以避免很多因图片导致的问题
    8 m7 b3 Y' \( C
    3 S7 I: ~5 K6 p! K# _1 K1 [) Z(2)在matlabplot中,显示图的第一步是创建画布,plt.figure(),然后在画布上添加子图,最后显示整个画布的图像时,并且让子图自适应来显示。而我遇到了这个就是关于self.figure.tight_layout()的警告,见下图。
    ) u8 D/ a9 ?  ?. F( Q* Z- T+ i% @7 \/ P( t" h" V7 e) W$ U
    一般在使用plt创建一个画布后,程序本身会有一个自动调整子图尺寸来使用画布的情况,但是因为我是显示图片,所以这个自适应就出问题了。但是还好,只是警告,不是报错,为了方便,忽略就好…(但是我不推荐这种做法,希望有人研究一下,并把解决问题告诉我)7 ]& _& U$ r6 ]8 L& ~4 ]  s$ G9 G
    为了方便,我直接在一开始加上下面这句,忽略掉。
    2 s2 Z: p/ J% d: `$ O, f4 c: P2 Qimport warnings0 Q9 f6 m. Z6 b  w$ z1 T6 b4 v# ?
    warnings.filterwarnings("ignore")
    4 X6 R8 q5 B% D0 ^8 ]* h, z
    0 \# l* a. {; T1 H( R要点
    % f/ s# w4 [/ W; p4 H% d: d8 y9 ~0 L5 v3 T
    1旋转图像现成的工具很多,一个是cv2提供的,主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图:
    % J1 {# g) d9 B2 V  g9 c% H2 n! i7 z5 S& G6 k* {6 ?4 ]

    $ T2 g4 J* q! I4 ], g, Y8 S 3.png 8 X2 `" s8 m2 h

    $ p/ ^% q5 B7 O+ {+ ~8 l这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。
    4 ?& P' z/ P8 D1 _: X: n9 D( E& {/ ?! b
    这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图% q# Q# v7 i+ S/ v5 q& n! v; H
    2 i9 c/ [: V8 a& x0 m6 O5 G* P; a
    6 c( p" w! u" D5 W* V
    4.png 0 m* u1 @8 ~9 H9 a
    ( M0 f  H" E0 p; I9 i: D/ h
    代码#! /usr/bin/env python. O  H- `  _1 n$ }* p: {5 p
    # -*- coding: utf-8 -*-
    4 w* T% _' G* o- \. z) r# ! python3
    * X; ]8 Z& Z: p  X# T
    , G( l" ?) R5 H4 ]2 pimport cv2( p7 G$ f  Q  u( x! K3 ]8 r- t( n
    import numpy as np
    ' p! p' o+ e6 Y3 Wfrom PIL import Image, Y7 e' L8 s/ s5 V/ ~
    from matplotlib import pyplot as plt
    ' x4 @  q/ c; y, ?import matplotlib.image as mpimg' r" k/ \1 H5 Z

    % _$ D. \$ C, y9 wdef rotate_image(url):
    1 f5 e! S0 [4 E, K        #旋转图像,并将其保存为4种角度的图片7 F8 [) Q' E  E7 ?5 e0 D9 p$ E5 v3 Y
        im = Image.open(url,"r")
    # J& B8 G2 a2 F( {    im = im.convert('RGB')  #避免有些图报错
    7 g' ]( @4 B% L1 p1 W) b" o    im.save('image_test/test_0.jpg')1 ]% U3 K2 [  v3 w( J8 f
        im_90 = im.transpose(Image.ROTATE_90)
    ! |# u1 d0 N/ R" j/ b    im_90.save('image_test/test_90.jpg')
    & |0 `. `  |" {" ?. ]! j; ]0 W  Z    im_180 = im.transpose(Image.ROTATE_180)6 h% h' |  q" _2 q; N
        im_180.save('image_test/test_180.jpg')
    4 A1 _. o. D% t5 y. {* j  R    im_270 = im.transpose(Image.ROTATE_270)7 o& k- V! R" ^$ S4 y
        im_270.save('image_test/test_270.jpg')) R2 @, m9 o' A( R9 A) A

    + J  i1 J) i$ W. |; ?" _* i8 L6 qdef plt_merge_img():7 Y2 h. w$ X6 `0 S
            #将保存的四种角度的图片,叠加在同一张画布上1 \& K8 F+ a2 t5 l
            #使用plt.figure()创建画布,并用add_axes()来分割区域显示图片
    % R9 v) P, A7 y, D+ S- D. B5 q        #显示画布,并将其保存为fig_size.png
    & S& M" d/ ~9 T$ T    img1 = mpimg.imread('image_test/test_0.jpg')& D- _0 X6 Z" i! A# E. t
        img2 = mpimg.imread('image_test/test_90.jpg')6 o: u  r$ [/ s7 b
        img3 = mpimg.imread('image_test/test_180.jpg')# `* Q* U( Y6 l6 @. [# U9 y  S0 j; w
        img4 = mpimg.imread('image_test/test_270.jpg')
    % W  G+ W4 k" s+ K' E) |% n    fig = plt.figure(figsize=(60,59),dpi=96)
    8 A/ p. ]& S5 |2 [& R( c
    " `  W; O4 Q: v8 z#上方的横图
    ! Q- x7 S* E6 j+ l1 C1 `! ]) }+ V- a    ax1 = fig.add_axes([0.30,0.55,0.42,0.28])  ^; i: }1 R' x& K. t
        ax1.imshow(img1)
    7 B/ W7 y0 ?- K0 S+ L2 j/ U    ax1.axis('off')2 ~! R& E# F# P: l1 d% }

    ; ~6 K2 l) j; v. [. y6 Y& y% `# 右方的竖图
    5 s( m5 c! E$ d% p1 O7 ^/ R    ax4 = fig.add_axes([0.67, 0.29, 0.28, 0.42]); J5 t2 W- X, R( }9 H, ~
        ax4.imshow(img4)# x% i6 h9 e: _# M8 Z
        ax4.axis('off')
    # n9 ^# C6 U  ?0 ]( K: e
    0 k% J; @0 C6 G0 K# 下方的横图
      e3 o5 t/ M' `& @% ]/ V& r% G    ax3 = fig.add_axes([0.30, 0.18, 0.42, 0.28])# ^# r9 a# {& K7 N
        ax3.imshow(img3)
    & `1 J; B; R) p5 t/ i: l3 ^9 i    ax3.axis('off')8 h  [' b  Q- A2 u) H
    . T# F- B- C1 j; ?0 b
    #左方的竖图
    * ]% ?0 H5 |4 i" R3 G" V    ax2 = fig.add_axes([0.07, 0.29, 0.28, 0.42])
    % D1 {$ K( z" T& w" W6 X    ax2.imshow(img2)) b6 w& m6 L$ l8 W; n; y3 S
        ax2.axis('off')
    0 |% P/ j  `  {- f    # 保存为sig_size.png
    / z4 @7 j: H# R2 x- _$ u- E/ j    plt.savefig("fig_size.png",dpi=96)
    6 a8 C9 ]1 Q3 j( ~$ p    plt.show()
    : ^- s; @4 L' p. g4 @+ S$ W$ N4 i; e( @
    def main():
    3 L7 e2 ]" H( b5 ]    url = 'test_1.jpg'2 K. T" l& W1 m7 p1 |& E/ \
        rotate_image(url)
    ( g0 N" p% f1 i: `    plt_merge_img()
    , O3 c* s  o4 W. ~
    * R. h/ R  E7 vif __name__ == '__main__':+ v( E4 w. }! z4 g
        import warnings
    " Q: m( i1 v; Y1 v. b; \    warnings.filterwarnings("ignore")' m& S0 S2 @4 Q: M4 j
        main()( {8 w( l# u$ B( G

    1 w3 j! u; O0 D$ }, ~+ @: x————————————————. i, Q! R$ ?! ^8 ^  A; U
    版权声明:本文为CSDN博主「你要啥自行车」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    - }; E) d- t( A原文链接:https://blog.csdn.net/weixin_42572826/article/details/106033709
    7 \4 D8 g% l, W7 m6 c" f9 q
    8 |- @3 l7 X! k% ?) w$ s2 G1 @  \1 j+ q  }8 g9 m

    & t4 |/ z7 |! z7 Y- T
    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, 2025-8-23 02:22 , Processed in 0.445327 second(s), 58 queries .

    回顶部