QQ登录

只需要一步,快速开始

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

    0 B9 [* a- P* Y9 ^& o8 b/ a2 b3 Cpython4次旋转图片后,多图叠加显示
    2 d9 K. z  ]8 z) ], p0 h  K( M1 c8 j[color=rgba(0, 0, 0, 0.74902)]文章目录
      # K$ F9 g0 S3 h! |2 k/ P
      • 想要的效果对比,原图VS显示
      • 问题
      • 要点
      • 代码
        9 u0 F2 U: ?9 @: u
    - _- V: f/ \  |9 E
    % V9 Y/ m  ]  G
    [color=rgba(0, 0, 0, 0.74902)]前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog
    9 b1 i0 a. X- R: Q5 b, t) v' S2 D想要的效果对比,原图VS显示 1.jpg 1.jpg
    # w  h$ M9 t8 h0 T% O" b  r% e) _, O+ q4 ~6 k9 \- \
    . _( j: K9 |7 J0 a9 F4 j3 P% J
    问题
    ( j1 i+ V4 Y" z- L2 s( K) ]" G8 W1 L
    (1)在刚写出来时,在rotate_image()函数中没有加,im = im.convert(‘RGB’)这句话,就会出现有的图正常,但是有的图报错,无法保存,并显示下面这句话
    1 T3 o# j, ~" O6 [3 g6 |; X8 j3 c6 o4 L9 o  {2 W. U$ U" ^
    这个问题可以在这一篇blog找到解决方法。就是im.read(url)后,再将图片转换为RGB格式(image.convert(‘RGB’))。这样就可以避免很多因图片导致的问题
    ! ?8 l$ N( p, R- T5 ]) i- M% x1 a5 O. W
    (2)在matlabplot中,显示图的第一步是创建画布,plt.figure(),然后在画布上添加子图,最后显示整个画布的图像时,并且让子图自适应来显示。而我遇到了这个就是关于self.figure.tight_layout()的警告,见下图。* c( [$ w1 h% h' A$ h& M
    0 f+ x/ h. T! h
    一般在使用plt创建一个画布后,程序本身会有一个自动调整子图尺寸来使用画布的情况,但是因为我是显示图片,所以这个自适应就出问题了。但是还好,只是警告,不是报错,为了方便,忽略就好…(但是我不推荐这种做法,希望有人研究一下,并把解决问题告诉我); U& D( F( A% Y* \
    为了方便,我直接在一开始加上下面这句,忽略掉。* K$ }, l# w6 l! ?
    import warnings
    * n" G' Q7 |8 O' Wwarnings.filterwarnings("ignore")# `+ O; C" x; j5 O" p% T
    2 C# K. s) T* ]5 B7 V- k6 L
    要点
    . c4 O7 `+ M: ~1 ]& {  F. l4 A$ L0 W1 z
    1旋转图像现成的工具很多,一个是cv2提供的,主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图:3 V) P7 d7 K/ W

    / y# V6 _( Y1 w. p) I3 h% j. c* t- e3 E" v4 s( d. K0 t
    3.png
    9 Q' d, i) K% T" r+ L4 l* R
    9 R" l. ^6 b. w这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。( S, P7 [/ W& V) F' g  m2 |

    0 ?  i; y. u3 `8 k0 Q9 M! ]这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图; j- a/ @. E* h! |5 B" k& d" ^% s' c' b* d
    2 b& X$ k+ D" k* N! d* S% h
    & O+ X7 B  h: c& F" W
    4.png
    8 [# D7 n7 O" x" s5 d# t4 M! c% G, w! n6 b
    代码#! /usr/bin/env python
    3 T5 g+ A0 s& f8 m# -*- coding: utf-8 -*-- F4 h0 r; O1 x$ v: B# z' N
    # ! python3: `$ x+ v$ ], c7 e

    & V* R( v% ^& ^1 g: Bimport cv24 h6 B4 g5 C0 ]9 \
    import numpy as np2 ]( P& j: o, {0 R8 [- C
    from PIL import Image3 N, T& k) A, g
    from matplotlib import pyplot as plt7 u* x2 y/ {: b- I1 o
    import matplotlib.image as mpimg& B6 X" o" q" @3 u* ]' G: u5 M! |
    * P' o/ n/ q* [# ^" v% S; B
    def rotate_image(url):
    , J; N" s9 j6 \8 ^        #旋转图像,并将其保存为4种角度的图片
    # r1 G0 ^# f9 x    im = Image.open(url,"r")
    0 \; ^( v* @: V* h# n$ P* j! a    im = im.convert('RGB')  #避免有些图报错 5 J- D# J* i, ~) G' P
        im.save('image_test/test_0.jpg')  n5 d; ~+ a5 K
        im_90 = im.transpose(Image.ROTATE_90)
      z6 ]4 p/ t: ~( \7 J    im_90.save('image_test/test_90.jpg')
    # S5 r. u* b1 U1 ~$ R    im_180 = im.transpose(Image.ROTATE_180)
    7 C' X! H: H( S# i    im_180.save('image_test/test_180.jpg')
      u, ]* g$ v! W/ h4 j    im_270 = im.transpose(Image.ROTATE_270)
    ( q4 O) F5 \/ Q1 c5 E/ J    im_270.save('image_test/test_270.jpg')
    - }/ h; s( h3 P; q0 y. g1 ^; Q- [" _* y7 y2 p+ Q1 N+ u4 e
    def plt_merge_img():
    " m7 v& {" K; D, U% t        #将保存的四种角度的图片,叠加在同一张画布上* ~7 C. A9 j" B9 K9 o
            #使用plt.figure()创建画布,并用add_axes()来分割区域显示图片
    / ]# t# Y5 U1 s; r5 o        #显示画布,并将其保存为fig_size.png
    4 f) |$ k0 O' H* e: P    img1 = mpimg.imread('image_test/test_0.jpg')
    9 J1 _4 \0 r. N, ?& L, }    img2 = mpimg.imread('image_test/test_90.jpg')8 V& o4 E: X. e. D* z# d; u: x
        img3 = mpimg.imread('image_test/test_180.jpg')
    ! b: [: Q" Q( f2 R: e9 q) v    img4 = mpimg.imread('image_test/test_270.jpg')( _7 t7 L! k( `9 R, k: Q
        fig = plt.figure(figsize=(60,59),dpi=96)
    * C( ^9 F% Z/ n- ^. R/ Y% w5 D; U
    * ]+ P# l/ L9 o1 \! F7 P#上方的横图" e; v" m* E& h2 n" T" h
        ax1 = fig.add_axes([0.30,0.55,0.42,0.28])
    3 ?% F; b+ d, n9 |5 y. T3 p! ^& {    ax1.imshow(img1). `( c9 l# }3 Y' c' ~
        ax1.axis('off')
    $ T- Q3 J2 @) b- f+ E8 Y
    6 J; t+ x/ c$ Y& Y- `5 ^# 右方的竖图
    + e2 H- \, k% O* `4 E    ax4 = fig.add_axes([0.67, 0.29, 0.28, 0.42])
    1 V0 o3 Q/ t& q    ax4.imshow(img4)5 l( @) |  ]1 n: S
        ax4.axis('off')
    8 x$ U. N: u4 o. q$ Q7 T/ S. L6 o' u/ k
    # 下方的横图  g6 m6 x  \% M6 q/ @3 V: y- l$ B
        ax3 = fig.add_axes([0.30, 0.18, 0.42, 0.28])
    8 v1 D( j' B1 c6 |9 K    ax3.imshow(img3)
    % [: s( s& i( S. j; V) r* G7 r    ax3.axis('off'), q+ s6 q* f4 t, U

    , q* c4 L  Q, E1 Z  A$ m0 H# a#左方的竖图1 p" j' ^  ~! E# m- y0 S
        ax2 = fig.add_axes([0.07, 0.29, 0.28, 0.42])0 x% k8 b6 A. f; Y6 L& D
        ax2.imshow(img2)
    5 |9 k& \3 A& ]& J; Q1 P    ax2.axis('off')
    0 \$ }  e( M7 K+ \# ^" k    # 保存为sig_size.png
    + n0 I4 g( k" \( i    plt.savefig("fig_size.png",dpi=96)
    0 |3 d- B1 C5 A1 ^) S$ h7 j/ K, Q    plt.show()
    2 L4 X6 ?3 L( r1 \9 g; a
    ; r+ P0 A8 s1 zdef main():/ a' n6 \9 d$ ]- z+ F7 d& _+ ?
        url = 'test_1.jpg'
    1 s8 ^0 e' g6 j/ q    rotate_image(url)
    5 \: D) Y9 X% S8 O' l0 d/ j    plt_merge_img()1 ~4 Q2 {' h# v8 f0 {8 I- T- A

    9 Q$ R  ~5 N7 |  v+ Q3 g5 x$ N. [if __name__ == '__main__':
    ; K, G' I! O+ s1 w    import warnings6 Y% p1 ^/ d& C, ~2 z9 y
        warnings.filterwarnings("ignore")* V) f3 |) l0 e# b1 J& @
        main()* H! V+ L( W) j" ?/ m
    6 J. X! w% w& C( M7 D* K1 G3 I3 Y
    ————————————————
    1 o! ]3 M+ `; d# ]$ b+ J* |版权声明:本文为CSDN博主「你要啥自行车」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    % D  d8 a. e0 z  A原文链接:https://blog.csdn.net/weixin_42572826/article/details/106033709
    0 t, N1 e0 f: f1 e+ X" L( B6 v$ P  M8 b' y6 `+ p6 D: Q: D  O7 l

    6 @6 L; a) O3 N* L0 [0 Q4 e5 p$ o" b% b5 ~) y
    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 12:37 , Processed in 0.455891 second(s), 59 queries .

    回顶部