QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1649|回复: 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
    1 ^9 Y; b( f9 t6 V. @+ `0 E
    python4次旋转图片后,多图叠加显示
    # b5 f% B, j; t# r4 Z1 b  c[color=rgba(0, 0, 0, 0.74902)]文章目录

      2 T! _; M3 h5 r6 F, ^2 V
      • 想要的效果对比,原图VS显示
      • 问题
      • 要点
      • 代码0 P& |$ S. n9 f4 g! @$ M
    % g* {' C7 X' }/ f) T
    , l( o( M- l2 q) e1 u* {
    [color=rgba(0, 0, 0, 0.74902)]前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog
    ' k9 H3 w4 W' w$ x; e7 r想要的效果对比,原图VS显示 1.jpg 1.jpg
    5 G4 [- ^- \$ z$ \: `+ r$ K- w0 O% H! f5 D" y  z, O
    ; i* b, B/ z# ]$ p& d
    问题" T8 x# p# Y% b0 g9 B1 }- x; X0 c

    3 a! D/ L  F( A; Z2 _. I  S(1)在刚写出来时,在rotate_image()函数中没有加,im = im.convert(‘RGB’)这句话,就会出现有的图正常,但是有的图报错,无法保存,并显示下面这句话
    9 M7 W" y+ ^: b" Y
    $ t0 j4 Q" x0 [! u4 D这个问题可以在这一篇blog找到解决方法。就是im.read(url)后,再将图片转换为RGB格式(image.convert(‘RGB’))。这样就可以避免很多因图片导致的问题
    9 r, |' N. ^/ S& h$ s# {1 o; g4 I2 q9 O
    (2)在matlabplot中,显示图的第一步是创建画布,plt.figure(),然后在画布上添加子图,最后显示整个画布的图像时,并且让子图自适应来显示。而我遇到了这个就是关于self.figure.tight_layout()的警告,见下图。
    / v1 J: e( J" B9 H* z& Y: L/ K2 X) R7 h+ M
    一般在使用plt创建一个画布后,程序本身会有一个自动调整子图尺寸来使用画布的情况,但是因为我是显示图片,所以这个自适应就出问题了。但是还好,只是警告,不是报错,为了方便,忽略就好…(但是我不推荐这种做法,希望有人研究一下,并把解决问题告诉我)$ d6 p4 ~& V* Q$ O/ e/ x8 i- k0 r
    为了方便,我直接在一开始加上下面这句,忽略掉。8 i7 {7 y. K1 z& r1 @2 C
    import warnings
    % N5 K5 ^% f! t. ~warnings.filterwarnings("ignore")
      h7 C3 b8 |( l+ R
    # |# z" q- J" w0 O) d) v+ p要点
    . d+ x1 ^- r3 H  F' W8 Q' `
    - M) A- h/ u/ d1旋转图像现成的工具很多,一个是cv2提供的,主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图:+ ~5 B- V3 G. F# y' y* Z0 P/ m
    * o- o+ J2 A* K

    6 S) E# v( N7 n. [: z 3.png
    6 c) P) S% f  k. j; K/ e0 }2 m; v  ?5 q
    这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。% N1 N$ g: }8 X5 A
    9 W: H9 J- _  {( p- H4 n6 d
    这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图: [: y+ v1 F7 J/ ?1 D

    & K2 I' C% k0 L# b
    ; ]+ P* C! I9 U: S7 K  {, k 4.png
    # Z! }4 |0 d0 c9 }' }$ a2 V: }) ?9 g/ `9 N# P
    代码#! /usr/bin/env python
    + B# A% _5 s! g2 o; L3 Y# -*- coding: utf-8 -*-
    % C- S  a* q, ^: O; }# ! python3
    5 s% n8 k) w+ U/ `2 M3 Q- ^, ]6 Z+ c) g3 w" I7 b
    import cv2
    : z: T0 O$ }4 U/ z; u- }import numpy as np- }8 d8 Q* {) U0 n/ F
    from PIL import Image7 }' t. W! D8 L; |* Q
    from matplotlib import pyplot as plt
    7 T7 i* N, L- Ximport matplotlib.image as mpimg* e( C8 v+ o3 |. {0 n! i

    ' m1 e' k" i2 m# ^def rotate_image(url):
    + d6 |8 b& W# M1 s+ o( ~! ^        #旋转图像,并将其保存为4种角度的图片
    0 ]& a9 p' d* T, U$ Q2 X3 v    im = Image.open(url,"r")' [! Y" r/ X% w4 ]& D- J
        im = im.convert('RGB')  #避免有些图报错
    & t2 r. O$ d% R* p. c8 e: Q+ Y    im.save('image_test/test_0.jpg')
    , l  a9 Q( M$ ~( v- q) k7 `    im_90 = im.transpose(Image.ROTATE_90)
    0 I7 B0 j+ {6 w) T2 i    im_90.save('image_test/test_90.jpg')8 ^4 z4 D! v2 D$ t) j4 P
        im_180 = im.transpose(Image.ROTATE_180)/ u+ C& R0 w0 B; M2 A1 Q( o! H
        im_180.save('image_test/test_180.jpg')
    9 \+ j! k8 W7 G; S+ j6 Z0 J    im_270 = im.transpose(Image.ROTATE_270)- G: v) C4 `7 y2 `4 }2 W* s
        im_270.save('image_test/test_270.jpg')
    , I( o& |" b0 @2 E5 q# c) ]1 R( M# `
    ; \7 f/ M5 X% C+ L( @& `) tdef plt_merge_img():6 Z2 H" b$ _( P, z
            #将保存的四种角度的图片,叠加在同一张画布上
    * ~/ B8 T7 e0 V: t$ f1 O7 C        #使用plt.figure()创建画布,并用add_axes()来分割区域显示图片
    3 ^$ N: M; o( ?: B+ k        #显示画布,并将其保存为fig_size.png
    4 r$ U0 i: G( W& a3 I& A5 O    img1 = mpimg.imread('image_test/test_0.jpg')
    9 A7 P" }( Z9 M- {    img2 = mpimg.imread('image_test/test_90.jpg')
    - H+ U7 X! N5 A$ T% _    img3 = mpimg.imread('image_test/test_180.jpg')5 b) @( v3 U1 U# m8 \) V" u& x
        img4 = mpimg.imread('image_test/test_270.jpg')5 k2 ?( U) i6 N* C* U8 p# U6 K
        fig = plt.figure(figsize=(60,59),dpi=96); J6 p$ A2 G/ c8 }

    + I5 O+ Y0 v) o9 `) W#上方的横图! R/ V7 \3 I1 I  ?  |% K! |; B
        ax1 = fig.add_axes([0.30,0.55,0.42,0.28])
    5 \( Z; A$ H( @8 H1 [. K    ax1.imshow(img1)' I3 Q* C; N; d
        ax1.axis('off')
    ) q  Y" }2 X9 Y! b, R& w. ]" ]3 g* ~
    # 右方的竖图1 @9 S. m5 |, \* C" w
        ax4 = fig.add_axes([0.67, 0.29, 0.28, 0.42])
    $ C' r6 t+ V5 t    ax4.imshow(img4)
    ( o& n7 d; o- A( O3 N+ U    ax4.axis('off')
    $ }0 G6 p: ?* }, q* m9 b' n
    4 K1 ^- V) `9 Q- V8 O# 下方的横图) M& w  [1 y" G( `
        ax3 = fig.add_axes([0.30, 0.18, 0.42, 0.28])
    ) A; z7 R# i, f+ K    ax3.imshow(img3)
    ; Z4 T8 @  e3 q2 u: {    ax3.axis('off')& j; t0 s6 S9 r- q1 O: A& e  `3 {
    # I' }( t7 S# x/ f+ C$ p- \
    #左方的竖图+ ?- d& A, t; J! M3 K
        ax2 = fig.add_axes([0.07, 0.29, 0.28, 0.42]), W: e6 `4 N$ j/ V/ g' m* a
        ax2.imshow(img2)
    $ M# u8 H8 J6 a- S7 b    ax2.axis('off')
    ' W' ~" q9 f3 y! \    # 保存为sig_size.png
    6 @1 C0 S1 x, O    plt.savefig("fig_size.png",dpi=96)+ Q) E+ p. b3 G" S2 ?
        plt.show()% \1 E+ J0 ~* X! {9 _; Y  i

    $ Y4 L' f; b3 jdef main():
    " m! X4 d# {+ I/ c    url = 'test_1.jpg'7 f: z3 e! Z  j: L. F
        rotate_image(url)
    & k/ ~# O7 B' {8 g# |, J$ c, g  C2 _7 G    plt_merge_img(): e% S1 i0 F7 ~/ B
    . s* D- X4 S% c3 R# Q9 M
    if __name__ == '__main__':, B+ f, O1 m# V
        import warnings
    7 b3 Q1 y0 w9 }4 J8 D1 R& k    warnings.filterwarnings("ignore")
    % @  g7 \7 o+ Z3 G; s2 K  z    main()* d$ a: h3 p, R. b0 r3 ^+ M
    , }& f) z- y, k# [+ K+ f6 r
    ————————————————2 V6 g% s) b5 i& Y
    版权声明:本文为CSDN博主「你要啥自行车」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。" E( R6 I5 [  W# i
    原文链接:https://blog.csdn.net/weixin_42572826/article/details/106033709. \0 X3 {1 I. b7 Z4 y

    2 U# |- c& k0 C* J% K5 m! e0 `5 r- j+ q5 e- C

    ; o2 X* V. C1 z  G, a* f; _
    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-7-25 22:22 , Processed in 0.461736 second(s), 60 queries .

    回顶部