QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1648|回复: 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
    7 ?$ \+ q, B+ m) p8 r
    python4次旋转图片后,多图叠加显示1 `0 Z0 |/ N/ s) ~1 N3 @
    [color=rgba(0, 0, 0, 0.74902)]文章目录

      3 i/ K  m2 t3 r2 y+ ^
      • 想要的效果对比,原图VS显示
      • 问题
      • 要点
      • 代码) ]. {/ g* l. ?! B! ^2 b& H$ |
    & O# ]) v& N% O: W" M! t. @' f
    / k! n7 _1 O7 |7 y! w9 M( l
    [color=rgba(0, 0, 0, 0.74902)]前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog
    - S1 W, C" G" j+ N想要的效果对比,原图VS显示 1.jpg 1.jpg " R: g& [, X2 U
    6 f' ^5 G/ X3 j2 q6 o2 ?8 h
    7 z, B$ y) Z: Z
    问题$ f- |* C4 Q  I( T0 ]: _( u! ]

    & {* S# v' ]) {6 n/ l(1)在刚写出来时,在rotate_image()函数中没有加,im = im.convert(‘RGB’)这句话,就会出现有的图正常,但是有的图报错,无法保存,并显示下面这句话- l4 |+ B; ?4 A) q! u
    ( {& ]) I7 B+ u9 ^! I
    这个问题可以在这一篇blog找到解决方法。就是im.read(url)后,再将图片转换为RGB格式(image.convert(‘RGB’))。这样就可以避免很多因图片导致的问题
    8 e* c  l! K* }1 K( B7 T; R
    ; G; Z8 E: N) ^, k! k(2)在matlabplot中,显示图的第一步是创建画布,plt.figure(),然后在画布上添加子图,最后显示整个画布的图像时,并且让子图自适应来显示。而我遇到了这个就是关于self.figure.tight_layout()的警告,见下图。
    - M  G- R0 e0 y2 k
    9 q( q/ K5 Z: h( k; N一般在使用plt创建一个画布后,程序本身会有一个自动调整子图尺寸来使用画布的情况,但是因为我是显示图片,所以这个自适应就出问题了。但是还好,只是警告,不是报错,为了方便,忽略就好…(但是我不推荐这种做法,希望有人研究一下,并把解决问题告诉我). n: V" e7 r) A4 i  d3 d  d
    为了方便,我直接在一开始加上下面这句,忽略掉。
    3 O" e7 Q5 b3 ]2 B7 t7 {import warnings  w9 {6 L8 `$ q
    warnings.filterwarnings("ignore")
    : `9 b9 E8 P! e3 _
    - b, T, D: Y" I  _' M3 o/ ~5 j要点3 ]; u8 |, _" e7 a$ h

    " p! D# w* L' S/ v0 M: J9 c1旋转图像现成的工具很多,一个是cv2提供的,主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图:
    ) |9 c6 m4 ^3 K
    1 z% o. J) ~* J0 K1 V9 w* a; a) E
    3.png   q+ `. ^- B1 ^+ K( D- V% J* K# {
    " I. A3 m- [. d" {
    这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。8 ~- |6 E. t7 c5 `! s
    ; I! Y6 y0 _  Y: j
    这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图1 Z4 V- t3 f( [2 i4 b+ P
      s) p6 `" l1 o2 E3 N/ b
    9 C( }" K+ w' S8 {5 M& }
    4.png   w; V) @9 g" j: }& K; m4 a1 F3 Q
    2 Y( }7 ~% O* t. [8 _3 C2 ^
    代码#! /usr/bin/env python: A1 C& e6 }4 P
    # -*- coding: utf-8 -*-* k) G! s+ ]5 V7 W5 v
    # ! python3
      C" ]+ g+ M: D. b
    9 F1 s( c+ s1 D* @$ x7 C# Pimport cv24 b! P; ~  z2 r
    import numpy as np
    # G( ?9 g! S, z3 _+ [7 f& gfrom PIL import Image; h! l8 T$ w( l' a7 g9 B- }2 m
    from matplotlib import pyplot as plt! K4 [, D' u  H" Y6 V) m
    import matplotlib.image as mpimg
    " F: O0 S) O2 V- ]" ^% J" w  U/ o
    ; e, h& b  r5 X; Wdef rotate_image(url):) d9 D3 T4 Q+ Z" o  t9 l
            #旋转图像,并将其保存为4种角度的图片
    3 `7 A/ Q7 O% K1 T    im = Image.open(url,"r")/ U9 g. L. D/ l4 I
        im = im.convert('RGB')  #避免有些图报错 " r+ A) P0 P+ B' m$ X
        im.save('image_test/test_0.jpg')
    & C9 f+ o" a4 w4 B& }8 o    im_90 = im.transpose(Image.ROTATE_90)
    4 H! |: @6 r7 K5 h# T    im_90.save('image_test/test_90.jpg')7 X; ~6 U' q. A
        im_180 = im.transpose(Image.ROTATE_180)2 r, ~" i; N* G0 o
        im_180.save('image_test/test_180.jpg')
    ( ~  [; M8 j7 k- K* t% \    im_270 = im.transpose(Image.ROTATE_270). q; g; `( S; y( Y3 E+ C) U
        im_270.save('image_test/test_270.jpg')
    - X) H! f- v; D% ^. Z) ~
    $ j  f& ]6 ?2 b+ {/ L$ n  Ydef plt_merge_img():
    * A2 x" W: O3 j  _        #将保存的四种角度的图片,叠加在同一张画布上# _# N% L1 m7 \
            #使用plt.figure()创建画布,并用add_axes()来分割区域显示图片0 U# N  N9 F/ z3 p1 y5 e% A! T
            #显示画布,并将其保存为fig_size.png1 e; j, L1 A+ `
        img1 = mpimg.imread('image_test/test_0.jpg'), e9 l: z2 b5 b) V7 r6 `- Z6 k
        img2 = mpimg.imread('image_test/test_90.jpg')( {  u0 z# ^7 O2 m/ N
        img3 = mpimg.imread('image_test/test_180.jpg')
    & r/ h  B. H$ Z$ U( ]+ [    img4 = mpimg.imread('image_test/test_270.jpg')
    8 U0 v: W, ^- r; @7 e) `9 m; ?    fig = plt.figure(figsize=(60,59),dpi=96)/ q$ T0 Q' V) l+ A
    * `% ^# Q8 s! h1 h
    #上方的横图
    5 e& t  I+ P+ \" H- \0 r/ O" a    ax1 = fig.add_axes([0.30,0.55,0.42,0.28])
    ; A! X3 H8 o" j) c* u    ax1.imshow(img1)
    ! A3 _( {9 C' d9 z- o' ~) o    ax1.axis('off')9 w9 L  Y1 W$ `7 V

    " D# k1 U; L; l) W1 V# 右方的竖图
    6 U& ]" v! U, k    ax4 = fig.add_axes([0.67, 0.29, 0.28, 0.42])
    2 ^9 [6 o! v" U( T) v/ l: ^    ax4.imshow(img4)
    + ~9 _) B7 X& o+ V1 O    ax4.axis('off')4 y6 `5 m3 }( j

    / j# L- k' }7 C8 V# 下方的横图1 `- Q& h: n  y" H5 h0 j" L2 f
        ax3 = fig.add_axes([0.30, 0.18, 0.42, 0.28])" a, F- h  L/ |/ O  C7 |2 G+ B7 Y
        ax3.imshow(img3)5 c4 L1 `$ u0 X1 v* I
        ax3.axis('off')9 }5 _% z5 B) a
    % Y3 h7 k% C/ I- p$ w; U
    #左方的竖图
    4 W4 L# ?. n- h: ]    ax2 = fig.add_axes([0.07, 0.29, 0.28, 0.42]). F5 j; M3 Z7 @& T$ s- ]9 w
        ax2.imshow(img2)  L& i6 ?* t4 d: Q* Z- h
        ax2.axis('off')% v) G2 X6 Z. ]; p1 Y- M
        # 保存为sig_size.png
    ( N  e! X1 C( d    plt.savefig("fig_size.png",dpi=96)/ L, Y+ R4 |0 V  [8 j& F
        plt.show()/ v" ^- E. K; j/ I2 y" f% E3 m
    0 \- V# C$ M  z  X6 ~! A3 I
    def main():
    / B$ Z# b& I0 m% e3 @! W    url = 'test_1.jpg'; U0 e4 e* s5 x. i4 Q
        rotate_image(url)
    8 M- l7 B. I. a$ `" a    plt_merge_img()  A! \3 R4 D' s& [' }

    8 z: J' F9 V. J5 Q4 S$ Rif __name__ == '__main__':5 P. N4 A" v2 D# X
        import warnings
    3 M! Z$ S5 [8 m" x7 q8 F$ I    warnings.filterwarnings("ignore")9 ?& ^$ T( I! u! F3 P
        main(), k+ M# V. ~# I% @2 z3 x
    9 \( w" _, b9 H4 I$ L
    ————————————————
    % k  c; @& e% h3 v( Q$ _+ Y版权声明:本文为CSDN博主「你要啥自行车」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。* f6 T- Q/ p, C* `; L" P
    原文链接:https://blog.csdn.net/weixin_42572826/article/details/106033709
    ! T8 K5 Z# W# `
    0 \- `" w% K. L8 M$ @
    6 ?' o% v) B  d3 h% L5 O4 ~4 |' R5 C; B( V, M
    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 08:21 , Processed in 0.990403 second(s), 58 queries .

    回顶部