QQ登录

只需要一步,快速开始

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

    . Y0 ^& _; T# o  ~( x7 Apython4次旋转图片后,多图叠加显示
    - Y1 G* A+ v8 W) U9 T+ i4 v[color=rgba(0, 0, 0, 0.74902)]文章目录

      & p* M# l  F: B9 H/ e
      • 想要的效果对比,原图VS显示
      • 问题
      • 要点
      • 代码
        $ t! R, Y3 v3 ~7 Q. \* L0 d

    0 O6 ~) E6 t) ^9 i9 Y7 p, [) T* N# [7 j' C& f9 A; n8 ]
    [color=rgba(0, 0, 0, 0.74902)]前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog: E! _) K3 [# ]
    想要的效果对比,原图VS显示 1.jpg 1.jpg
    $ a( M0 R# u: m1 k$ N1 ?/ v5 _, Z8 k# z  i
    " t0 ^* C' M/ C  A# u
    问题
    7 n6 Q- J/ \8 \) I3 z4 f/ H. a- P2 x# H3 f5 o$ K) q) D: U3 c0 `) P
    (1)在刚写出来时,在rotate_image()函数中没有加,im = im.convert(‘RGB’)这句话,就会出现有的图正常,但是有的图报错,无法保存,并显示下面这句话7 m2 O: X" q8 n4 E/ p

    * `1 ?" I/ \/ h: C这个问题可以在这一篇blog找到解决方法。就是im.read(url)后,再将图片转换为RGB格式(image.convert(‘RGB’))。这样就可以避免很多因图片导致的问题% w  L& z' e) k% C0 _

    0 |6 a2 I4 Q. {6 B! R' k(2)在matlabplot中,显示图的第一步是创建画布,plt.figure(),然后在画布上添加子图,最后显示整个画布的图像时,并且让子图自适应来显示。而我遇到了这个就是关于self.figure.tight_layout()的警告,见下图。3 K: m  x9 X7 p: F+ V+ B
    : k  H! O) M# K# p% T0 C
    一般在使用plt创建一个画布后,程序本身会有一个自动调整子图尺寸来使用画布的情况,但是因为我是显示图片,所以这个自适应就出问题了。但是还好,只是警告,不是报错,为了方便,忽略就好…(但是我不推荐这种做法,希望有人研究一下,并把解决问题告诉我)4 B+ h/ z; B  s5 {
    为了方便,我直接在一开始加上下面这句,忽略掉。
    ; M9 r! M( {# b( {7 j4 Dimport warnings
    3 N3 S& L6 }# T3 p) H5 `% Nwarnings.filterwarnings("ignore")
    1 j; f. g2 q) D- S7 Y9 ]/ m
    2 n  H, k. J5 v  s' W( v要点& a+ d7 Q' ^4 F/ J( H$ m7 c3 ?

    / u- H" w) q- D4 i% T1旋转图像现成的工具很多,一个是cv2提供的,主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图:0 x# i3 K5 g) D0 p; o3 @  b4 X
    " o& I: [# G% V, G+ C$ c
    5 w5 O7 @. }( G% r6 c/ K: o
    3.png , F7 T$ ~6 N' R0 x4 W! i; @
    4 o( ^. ~. K5 h& ]* a% d3 w
    这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。% R7 j2 u" }% }1 T5 F3 i5 n+ C; V

    % K! p+ [8 ~# G& V这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图9 Y- l! C" t* w* ?; Z: [
    0 Y) E/ L" w! J) M

    / {  M6 L  O* H1 u' Y4 p& k- X% O/ e 4.png
    4 ?2 H" |! z& m' b
    , _" a+ q  E) F, F' ~' Y  ?. G代码#! /usr/bin/env python
    " S% x7 U5 z8 f, D# -*- coding: utf-8 -*-# o/ L1 c0 H% T5 p( {7 Q
    # ! python3
    5 _4 N" k% A  v
    " }8 n& q6 P8 himport cv26 r1 a4 D  @2 J) A3 A  T
    import numpy as np/ V" G( F: G" `# x( x2 H
    from PIL import Image- Z) R, J9 v: K/ D; {2 l! B
    from matplotlib import pyplot as plt
    7 N+ a8 v* k9 j6 Qimport matplotlib.image as mpimg
    & y9 _5 u2 Z* ^! L: l
      B% w9 W8 R! W# l& I7 adef rotate_image(url):% Z4 L0 x/ H8 {5 w& l$ {; Q
            #旋转图像,并将其保存为4种角度的图片. G( e+ ]& q5 {# O: p* j
        im = Image.open(url,"r")6 R& a. j: Y2 w+ k; E
        im = im.convert('RGB')  #避免有些图报错 9 A% u3 S! `2 C+ y2 l- R2 M1 q' \9 N
        im.save('image_test/test_0.jpg')
    0 Y: \6 v( Q- Q( P( \8 r    im_90 = im.transpose(Image.ROTATE_90)" O6 e5 V$ @6 t! F( S/ K: @/ ~
        im_90.save('image_test/test_90.jpg')- `4 o+ Y2 }+ v0 M$ U1 Y( m* N
        im_180 = im.transpose(Image.ROTATE_180): C8 i& G# w6 U
        im_180.save('image_test/test_180.jpg')" U/ v" w2 ?, m
        im_270 = im.transpose(Image.ROTATE_270)
    + o% K. d9 J+ }! f$ U    im_270.save('image_test/test_270.jpg')4 Z: v  i0 C( r. w1 u

    9 K  E( {! J. X9 adef plt_merge_img():
    / Y% K8 N9 j; T  c  `        #将保存的四种角度的图片,叠加在同一张画布上
    . y3 }3 s8 F9 [" `' n        #使用plt.figure()创建画布,并用add_axes()来分割区域显示图片( l6 f8 `0 a; y
            #显示画布,并将其保存为fig_size.png
    # J7 b1 I8 q, S' Y; o* A0 w0 j# ?7 p    img1 = mpimg.imread('image_test/test_0.jpg')
    / b1 i9 F, o$ L7 ^0 j8 h" `    img2 = mpimg.imread('image_test/test_90.jpg')  L6 y3 x' Q! Q# S1 O
        img3 = mpimg.imread('image_test/test_180.jpg')1 S3 k9 x8 h" V3 _! k2 j
        img4 = mpimg.imread('image_test/test_270.jpg'): v& h' [2 |4 f
        fig = plt.figure(figsize=(60,59),dpi=96)
    1 w6 w3 ?9 M9 ~+ `7 @4 F8 {! q/ q" i
    & S3 N) T, r0 T% W3 E9 ?#上方的横图
    " G$ i" p, z* O2 [$ L( n6 a    ax1 = fig.add_axes([0.30,0.55,0.42,0.28])' m% x* M. I4 x, A
        ax1.imshow(img1)# Y+ U; Z9 i# m* L( R$ ~
        ax1.axis('off')3 r8 A! G6 D9 K/ g% K* t$ D5 @* @; O2 Q
      h7 ]) _% c$ w6 y; }0 H
    # 右方的竖图
    - L2 D  X( [$ C! G9 i    ax4 = fig.add_axes([0.67, 0.29, 0.28, 0.42])6 C$ r# o4 k/ _3 L3 n8 i
        ax4.imshow(img4)
    , a! I6 {/ B' g    ax4.axis('off')
    7 ^8 _4 o# z" N) X& N
    6 [. f$ E, P, B+ t9 [# 下方的横图
    6 [; ~1 c; \: G& v) I' R    ax3 = fig.add_axes([0.30, 0.18, 0.42, 0.28])
    5 Y9 v: y( ^0 @3 |0 I, ^    ax3.imshow(img3)! e: p. M/ l7 h) g: D1 y& v
        ax3.axis('off'), x$ p0 r. b, [" u5 T

    ! E3 f, o6 M, V+ E4 u$ w5 S#左方的竖图% F" u  X& X, k; D
        ax2 = fig.add_axes([0.07, 0.29, 0.28, 0.42])
    ) j+ X7 I* i* Q4 q    ax2.imshow(img2)  S2 I4 k" v- y1 \) F6 U# [% ]
        ax2.axis('off')
    & }3 C/ L$ T1 r    # 保存为sig_size.png5 z" x5 k7 D7 \; z
        plt.savefig("fig_size.png",dpi=96)
    3 L( m5 `  u+ Q' _    plt.show()
    & X& w. F2 F% {% e& @7 Q4 S- l+ C* \
    7 C7 `# L4 [# B0 W$ u; U4 l. h# ndef main():
    % u% _- c. Z1 p, K    url = 'test_1.jpg'
      j4 A2 s2 D7 @) {    rotate_image(url)" Y8 I9 _* T1 K$ Q& u; s) `9 g
        plt_merge_img()
    2 A0 ~) e( K6 x! K7 ?; `, i: Y
    ) x3 b, e; K9 l8 g% [if __name__ == '__main__':. M' ~- U* d: E8 V& s6 C6 l: @& F
        import warnings' s& W: q# f. B( _; F  {$ [
        warnings.filterwarnings("ignore")4 J2 Y& r/ X$ x5 v8 ~9 C3 i
        main(), M* S, i) c/ H  y$ r# J" K- `4 _# j

    - Z2 M1 V* C( O! I————————————————
    5 G; V: ], A1 [# d8 z" ?+ P版权声明:本文为CSDN博主「你要啥自行车」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    $ t% J* Z8 d3 b3 m4 G5 p3 G原文链接:https://blog.csdn.net/weixin_42572826/article/details/1060337090 M6 i2 ^7 Y% g
    " l% n' ^- e7 s4 H7 a$ w
    0 a- a. ]6 k# l. n6 d+ l( D# y

    0 n2 e6 v& x9 d; V# t" {9 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-20 15:46 , Processed in 0.397157 second(s), 59 queries .

    回顶部