QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 950|回复: 1
打印 上一主题 下一主题

python4次旋转图片后,多图叠加显示

[复制链接]
字体大小: 正常 放大
杨利霞        

5250

主题

81

听众

16万

积分

  • TA的每日心情
    开心
    2021-8-11 17:59
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

    自我介绍
    本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。

    群组2018美赛大象算法课程

    群组2018美赛护航培训课程

    群组2019年 数学中国站长建

    群组2019年数据分析师课程

    群组2018年大象老师国赛优

    跳转到指定楼层
    1#
    发表于 2020-5-10 16:27 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    5 W% C! S0 a. q
    python4次旋转图片后,多图叠加显示
    ; o* F+ M  o9 n' k& R4 F6 s[color=rgba(0, 0, 0, 0.74902)]文章目录

      & _( f6 x7 @6 `" K5 ]& |0 N5 @/ D
      • 想要的效果对比,原图VS显示
      • 问题
      • 要点
      • 代码. C# b+ z3 N7 {3 w8 L
    9 Z5 u" O$ h; a% i  D4 O! ^8 m
    " d1 d+ S( {1 z$ |9 m3 \
    [color=rgba(0, 0, 0, 0.74902)]前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog! Q8 P1 b' G6 @
    想要的效果对比,原图VS显示 1.jpg 1.jpg
    3 Y! T# X% N: F0 j; H% |5 e) o  y1 j% H- y3 G6 U1 j

    " R: h/ Z5 \. I9 H1 J问题
    - Q' m- o$ v; ?2 R1 v7 I; t
    $ F5 c2 C2 z! W5 w- _(1)在刚写出来时,在rotate_image()函数中没有加,im = im.convert(‘RGB’)这句话,就会出现有的图正常,但是有的图报错,无法保存,并显示下面这句话
    * i4 Q$ n( R/ M% w+ v$ z3 r# P6 P& t7 w/ y& w7 N
    这个问题可以在这一篇blog找到解决方法。就是im.read(url)后,再将图片转换为RGB格式(image.convert(‘RGB’))。这样就可以避免很多因图片导致的问题
    5 M& s1 ?' u/ ]$ @- [% f6 _5 l: F# t8 c
    (2)在matlabplot中,显示图的第一步是创建画布,plt.figure(),然后在画布上添加子图,最后显示整个画布的图像时,并且让子图自适应来显示。而我遇到了这个就是关于self.figure.tight_layout()的警告,见下图。2 |+ N* y% O& L( ]

    : X$ ~' W1 ~) M* j一般在使用plt创建一个画布后,程序本身会有一个自动调整子图尺寸来使用画布的情况,但是因为我是显示图片,所以这个自适应就出问题了。但是还好,只是警告,不是报错,为了方便,忽略就好…(但是我不推荐这种做法,希望有人研究一下,并把解决问题告诉我)
    ; F8 q1 ~, d& T% v( ~3 H为了方便,我直接在一开始加上下面这句,忽略掉。
    - b2 f) w* ?# Ximport warnings+ d+ Q8 I. l, M, K  j) I
    warnings.filterwarnings("ignore")7 |2 Y: ~. j/ }( V: w
    3 ?: h) s+ s0 z
    要点
    ' J! }! e4 [3 m3 z/ e" w9 N5 [0 N! P
    1旋转图像现成的工具很多,一个是cv2提供的,主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图:
    4 |1 j& g! J7 A. I& z1 W5 y$ \2 {# |( K7 H$ @9 n. i+ w
    / i3 P8 _2 q2 z& c! ^
    3.png
    % p6 {0 N. l! q, F5 }6 @0 e4 v$ R- T+ b0 Z# Q  Q
    这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。
    * O  A! o! Y. R% |
    1 x  P2 |6 U% Z! w; d( [& Z3 M% h这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图0 [) H' M$ L. {, ?* c' Z) s
    0 o) o8 I& o& O
    1 j: d# U; @$ s' E+ L4 `  c' ~) s' f
    4.png ) E0 w+ X  c! c) S8 `
    8 |, m1 a/ ]1 q3 I2 s, H! m
    代码#! /usr/bin/env python# o* k  U+ U  U, X
    # -*- coding: utf-8 -*-, ]" _3 |2 Z: `4 W
    # ! python3
    ; |- U3 N* z6 R2 S4 _# I: O4 G" r; g7 E# y
    import cv2
    ) S. c+ q5 C$ s8 V  `import numpy as np
    6 m6 o+ `) f9 \7 Ofrom PIL import Image8 i; y3 ?2 Q; o: M: Q
    from matplotlib import pyplot as plt% n+ z: p# J' {  f- w7 Z* ]
    import matplotlib.image as mpimg9 r- i; I5 f; Y/ _. M2 R
    : T8 ]  C+ C( u$ J& G$ F) |9 r
    def rotate_image(url):5 K! s# a6 [0 R6 s4 c( V& V
            #旋转图像,并将其保存为4种角度的图片$ k/ ?8 o7 }+ i+ J1 N& ?& |0 t
        im = Image.open(url,"r")
    ! I) F1 j, N4 Q, B) D% t    im = im.convert('RGB')  #避免有些图报错 1 b' e4 {/ B7 P$ r
        im.save('image_test/test_0.jpg')
    ! r+ S6 B: S7 u# }    im_90 = im.transpose(Image.ROTATE_90)
    , p0 P/ Q, w0 t4 s8 E4 g+ W    im_90.save('image_test/test_90.jpg'), K4 O+ `* N/ S9 `! |
        im_180 = im.transpose(Image.ROTATE_180)
    % V$ P' N* p- a3 s( }& O    im_180.save('image_test/test_180.jpg')7 P9 e& A5 z# W0 }2 @
        im_270 = im.transpose(Image.ROTATE_270)
    0 ~1 ?9 N2 w6 q& G7 h/ q! p! ^5 Z    im_270.save('image_test/test_270.jpg')% e8 B& l1 {5 z3 ?" f* F& ^! z

    + ~, D- s$ t& i' N7 f1 Fdef plt_merge_img():
    ' Z, N& e- c; v4 e1 `6 {        #将保存的四种角度的图片,叠加在同一张画布上3 j- [$ }! Y' E( Z5 k0 O0 J
            #使用plt.figure()创建画布,并用add_axes()来分割区域显示图片
    % e7 A  i7 f% s' O6 O, P; `        #显示画布,并将其保存为fig_size.png
    ' Z6 F' c6 q& P+ F$ ^    img1 = mpimg.imread('image_test/test_0.jpg')
    ! w4 R" J( L* i- _2 }    img2 = mpimg.imread('image_test/test_90.jpg')
    0 t7 N% m* o' q! {! {# M* R    img3 = mpimg.imread('image_test/test_180.jpg')
    7 B& C: _5 T' J6 u' r- Y' x! E    img4 = mpimg.imread('image_test/test_270.jpg')0 J6 R9 j2 V/ {5 N* S: _
        fig = plt.figure(figsize=(60,59),dpi=96)5 f) O  N' f+ F

    " [, Y: K+ `6 L#上方的横图
      ]. `9 G9 \; h( U+ u: p" V    ax1 = fig.add_axes([0.30,0.55,0.42,0.28])+ e* k' b6 p" q1 ?" ]4 M& H
        ax1.imshow(img1)
    ( t( \& C8 ]% @7 E$ O7 j    ax1.axis('off')
    & O& {- X- C) [( ]+ d
    ! m2 F  ?: V0 H" K- h# 右方的竖图
    6 J0 C! o3 ?; K3 ?* m1 G6 e/ d    ax4 = fig.add_axes([0.67, 0.29, 0.28, 0.42])$ s2 D( A' E1 g2 S
        ax4.imshow(img4)
    + n2 k' D$ G$ o3 B2 z! X4 ]9 H    ax4.axis('off')
    4 U1 V3 r4 a; M6 h7 O1 v% ?  G9 P# R
    # 下方的横图
    3 S4 j4 ~. I7 Q/ W    ax3 = fig.add_axes([0.30, 0.18, 0.42, 0.28])
    ! J& h5 r  T3 V% |: @    ax3.imshow(img3)" x3 e. t0 k  D* F
        ax3.axis('off')
    3 _8 Y. ?& e- T. I- ^
    - N! z/ P- r  S4 R3 Y( f#左方的竖图4 Y1 d7 \; X+ g. Y
        ax2 = fig.add_axes([0.07, 0.29, 0.28, 0.42])/ G7 X0 G  u: `6 q
        ax2.imshow(img2)& B. S5 j4 P6 q
        ax2.axis('off')
      w1 u8 A* `: h+ C* w    # 保存为sig_size.png3 I" W$ c# s, t  x- d# K
        plt.savefig("fig_size.png",dpi=96)
    : n3 h( R) ?7 I) l0 E, ^    plt.show()
    5 E+ Z6 r( A: D3 I& M, V# b, c
    & b! Z& i  I& w; ?; C% e& Ndef main():
    . K6 E, L% z# d4 \    url = 'test_1.jpg': Y; E$ ^6 G2 G# ^2 o
        rotate_image(url)0 @3 X) }  ~$ ~% y/ `4 V& T  ]
        plt_merge_img()
    4 c: p* d" O, _: l
    3 o$ W- _4 z- P7 z0 c' q$ r  J5 qif __name__ == '__main__':
    7 a& |3 K% n: j    import warnings
    2 l, p+ t: R' Y) i2 x) f5 o    warnings.filterwarnings("ignore")/ Y0 S. y' K' ]1 b
        main()
    3 o2 i" r! ?8 w" {0 w
    / F% R1 W$ x' W0 X3 z; ^————————————————8 t2 l: Q! g7 S
    版权声明:本文为CSDN博主「你要啥自行车」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    * _; ~" B3 a$ @) C" O" I原文链接:https://blog.csdn.net/weixin_42572826/article/details/106033709# B* @) M" u9 `+ A+ p1 U; i

    ) i! d, ^- f2 w) H
    0 O; n! t9 M$ w" S( O2 a9 e- V$ z1 S* z$ k: f1 @0 m& [) G3 B
    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, 2024-4-25 22:21 , Processed in 0.518302 second(s), 58 queries .

    回顶部