QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1438|回复: 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
    3 z. k' I; ?8 M- G; n8 l
    python4次旋转图片后,多图叠加显示
    1 m* p, `! b' m5 e! |$ r8 A9 w. p[color=rgba(0, 0, 0, 0.74902)]文章目录
      " P5 l3 n* J! L# r; m& L! A
      • 想要的效果对比,原图VS显示
      • 问题
      • 要点
      • 代码) u/ m0 J1 ^  V* D2 G! G

    ) f& G/ F" z5 ~
    , m5 j  F3 S# @, J4 ][color=rgba(0, 0, 0, 0.74902)]前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog
    " T( m. F( a8 U' b4 v8 l+ k% P想要的效果对比,原图VS显示 1.jpg 1.jpg
    7 \7 \3 e; l, g) q/ @8 x$ V% N

    1 m' \% Z* _" V问题; k9 a+ r) q( t  l% _, \$ X" Q, S

    : Y. T+ y3 L( P' Q(1)在刚写出来时,在rotate_image()函数中没有加,im = im.convert(‘RGB’)这句话,就会出现有的图正常,但是有的图报错,无法保存,并显示下面这句话
    7 _& r9 J, Q2 T5 O8 O& C0 R- D. w; y: w: y9 n/ b5 `
    这个问题可以在这一篇blog找到解决方法。就是im.read(url)后,再将图片转换为RGB格式(image.convert(‘RGB’))。这样就可以避免很多因图片导致的问题
    : _4 j6 l6 F, B% Q0 R+ J7 t
    # Q5 A; H4 C- X- t0 b(2)在matlabplot中,显示图的第一步是创建画布,plt.figure(),然后在画布上添加子图,最后显示整个画布的图像时,并且让子图自适应来显示。而我遇到了这个就是关于self.figure.tight_layout()的警告,见下图。4 a2 c3 I) o3 g2 m$ A3 ^! P
    0 u; C7 l1 d+ m. }2 S1 l/ d
    一般在使用plt创建一个画布后,程序本身会有一个自动调整子图尺寸来使用画布的情况,但是因为我是显示图片,所以这个自适应就出问题了。但是还好,只是警告,不是报错,为了方便,忽略就好…(但是我不推荐这种做法,希望有人研究一下,并把解决问题告诉我)' A+ U; s, X& @! ?# x
    为了方便,我直接在一开始加上下面这句,忽略掉。
    3 z# l+ a2 t9 ]/ S6 oimport warnings. Q) h2 U- h' h$ Q
    warnings.filterwarnings("ignore")
    & J- q& t) B  o% S/ A: P! Y$ H, m- L
    ! j2 G0 |0 K) g/ @4 N' p  z要点
    , c) w! I/ n5 o! Q: w- k6 b5 I/ I
    & }7 M9 s- s0 H7 q' n- w1旋转图像现成的工具很多,一个是cv2提供的,主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图:6 W5 W# L, U. i( g" X( `$ [
    ; w7 I/ Q0 C/ D$ I% v

    5 g6 @" @# Q" ~) \7 ?! I 3.png + G- |  N& {1 k6 p( \- O
    " m5 N+ j( a, V0 {0 t; \* m
    这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。
    + ^8 r' i' [* b. M3 W+ u
    1 e2 f9 h* d+ p, v这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图. S* X- \, P$ o6 ?2 `/ m. y
    / s) O9 f5 f' }+ a7 j4 |

    9 x8 M/ p& a# `" W+ U, e& S 4.png
    ! d" `$ \; c: ]/ B
    7 F& f: H3 y  O0 l" E1 l; N代码#! /usr/bin/env python
    ; U4 Z/ Z' ]0 x& g* |0 s# -*- coding: utf-8 -*-  Z, c3 T# U3 W% m# o
    # ! python35 ^% m" H, m7 s. M: f: N% f

    1 q& N# ], z/ m( o) m. K0 O1 J8 Yimport cv2
    % I6 _5 i0 e8 g' F* I4 Pimport numpy as np
    2 f9 d) m6 L7 S7 tfrom PIL import Image' B  `% Q6 N5 F" ~6 j- c1 l, g; ^
    from matplotlib import pyplot as plt
    : u8 V6 b/ N1 bimport matplotlib.image as mpimg: d0 t3 G( B5 D  R6 M( I4 g
    ' ]' a: |7 F3 m2 F) Z7 l
    def rotate_image(url):8 l& _# L/ O( K- W
            #旋转图像,并将其保存为4种角度的图片
    0 }1 x' z3 E4 k& g( \    im = Image.open(url,"r")
    4 g' u4 k, _5 O% d    im = im.convert('RGB')  #避免有些图报错 # W8 Y+ ^  i1 I% B
        im.save('image_test/test_0.jpg'), h3 A% w. d4 H
        im_90 = im.transpose(Image.ROTATE_90)# {9 k( Z' s- u1 s2 [4 R1 F
        im_90.save('image_test/test_90.jpg')( H% m+ y3 T2 o6 X$ v* l
        im_180 = im.transpose(Image.ROTATE_180)
    $ `+ k' E# {  b; j' O    im_180.save('image_test/test_180.jpg')6 m# V: T% T. e" c
        im_270 = im.transpose(Image.ROTATE_270)
    3 T; ~. Z, |9 ~, F! B    im_270.save('image_test/test_270.jpg'); l( `; I. t  Y9 }* ?
    ! @3 L$ f8 v/ a% y7 k
    def plt_merge_img():
    0 K" I% x0 j: Z) `! b9 Z        #将保存的四种角度的图片,叠加在同一张画布上7 \; F0 ?0 f7 W! M/ Q4 Z% \
            #使用plt.figure()创建画布,并用add_axes()来分割区域显示图片
    + W4 m* S% D/ H9 H        #显示画布,并将其保存为fig_size.png8 _. W$ D9 P5 j+ J
        img1 = mpimg.imread('image_test/test_0.jpg'): Z7 w1 D. p5 w" \: j. N( k  g
        img2 = mpimg.imread('image_test/test_90.jpg')" K2 V7 W% W3 C$ ~
        img3 = mpimg.imread('image_test/test_180.jpg')
    & ?, o5 w) D  O$ G$ f    img4 = mpimg.imread('image_test/test_270.jpg')
    - |# n/ S% }7 @' z- p    fig = plt.figure(figsize=(60,59),dpi=96)
    , `7 K6 V! q) ~3 E- U6 w% A; I
    : Y7 A4 Q, y4 l- ]2 ~#上方的横图/ U  N* T+ J( d$ P3 S6 g* y! ^
        ax1 = fig.add_axes([0.30,0.55,0.42,0.28])
    + i( v. H, @+ O! D. d$ g    ax1.imshow(img1)/ t! I- K* t& C8 M
        ax1.axis('off')
    . O! O" d4 o# c6 k3 Q8 x$ ^8 O3 ?: u1 Q5 Y) @2 y2 f
    # 右方的竖图
    5 h) _. L# t& O6 f    ax4 = fig.add_axes([0.67, 0.29, 0.28, 0.42])( M2 `+ K  q( c6 L
        ax4.imshow(img4)
    # c/ g/ N6 Q/ ]. r9 {9 q    ax4.axis('off')
    ; P9 y( p9 t5 c% n' [" M3 w3 Y3 ^0 F2 {$ {; N
    # 下方的横图2 _2 x0 i7 [, ]/ J
        ax3 = fig.add_axes([0.30, 0.18, 0.42, 0.28])
    / P; L, D& B/ t" e% H    ax3.imshow(img3)
    ( T3 T* y' A+ l0 ]    ax3.axis('off'), _* G( f+ J$ M
    9 S% C( a; N& H. n& q- V, D; o
    #左方的竖图' x6 g$ b( m6 E
        ax2 = fig.add_axes([0.07, 0.29, 0.28, 0.42])6 q) r9 d* o" R, H- C) ?" p" s
        ax2.imshow(img2)) Q$ U, d* E& P0 q
        ax2.axis('off')
    : f. v7 w) q" R, |- z0 N& T8 c. \    # 保存为sig_size.png
    ' B# `2 M9 N1 @7 c7 U, K    plt.savefig("fig_size.png",dpi=96)2 J; }4 d; C1 E
        plt.show(). y2 H, t: z2 `

    # C  i- r# \9 Q+ F* idef main():& ]9 g' n, e! J
        url = 'test_1.jpg'0 H9 N% M# c- Z' ?
        rotate_image(url)
    - }9 g& @0 a9 F8 T" i    plt_merge_img()- W$ x9 }6 J. s9 p0 p7 i
    9 }' b) X* G. |& `9 Q
    if __name__ == '__main__':1 Z0 j0 k' \) Z! i2 E1 H0 \# q0 u2 y
        import warnings" Y9 g$ W( e( i$ Q
        warnings.filterwarnings("ignore")
    * L0 l6 q8 R$ w+ B; w    main()
    ( E0 P& B5 \5 w& p  K& ]4 e4 B# h4 Y. v/ S2 ^0 Z4 g
    ————————————————
    . g3 E7 \% \0 d* t, s0 m版权声明:本文为CSDN博主「你要啥自行车」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    2 N* f3 i8 Z' T+ O0 Q2 Y( I原文链接:https://blog.csdn.net/weixin_42572826/article/details/106033709( p# h" @* Q( U" D- ~' ?( e

    : m, k* s2 `7 R$ v( W+ o8 g$ ?8 `  U: e& |0 I9 d

    % Q( Z3 C. G" o
    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-19 21:40 , Processed in 1.098890 second(s), 58 queries .

    回顶部