QQ登录

只需要一步,快速开始

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

    ) P2 a. \4 ]8 \; ppython4次旋转图片后,多图叠加显示
    # N' \8 j# M/ }* u[color=rgba(0, 0, 0, 0.74902)]文章目录

        ~$ ?5 J  n7 w# Z
      • 想要的效果对比,原图VS显示
      • 问题
      • 要点
      • 代码$ E) b" i" s2 K* J" [$ z
    & ?) w/ [( j$ T; `+ \

    " ]8 C& \) a* T! a[color=rgba(0, 0, 0, 0.74902)]前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog
    3 c! g1 m2 v6 Z2 [! S想要的效果对比,原图VS显示 1.jpg 1.jpg 5 Y1 |! l! c" f0 k
    ) m% r! U9 F$ g  M+ H
    0 I# ]/ L7 w1 j3 Z. D8 J
    问题
    5 a! o9 D; l" q& S7 L" q& I; `2 N
    (1)在刚写出来时,在rotate_image()函数中没有加,im = im.convert(‘RGB’)这句话,就会出现有的图正常,但是有的图报错,无法保存,并显示下面这句话+ c5 }. {; C! j6 U, I

    * K- h# |/ R! M: L这个问题可以在这一篇blog找到解决方法。就是im.read(url)后,再将图片转换为RGB格式(image.convert(‘RGB’))。这样就可以避免很多因图片导致的问题
    , n: `. a* V( f& r& z: ?1 ^) k$ o8 a: }9 F
    (2)在matlabplot中,显示图的第一步是创建画布,plt.figure(),然后在画布上添加子图,最后显示整个画布的图像时,并且让子图自适应来显示。而我遇到了这个就是关于self.figure.tight_layout()的警告,见下图。1 l& H/ r# {0 I
    2 m6 o4 v! W% |' d  P' k
    一般在使用plt创建一个画布后,程序本身会有一个自动调整子图尺寸来使用画布的情况,但是因为我是显示图片,所以这个自适应就出问题了。但是还好,只是警告,不是报错,为了方便,忽略就好…(但是我不推荐这种做法,希望有人研究一下,并把解决问题告诉我)! D) \, k9 W$ v0 d
    为了方便,我直接在一开始加上下面这句,忽略掉。
    , N- M& U9 A3 e# M  G5 S  `& Yimport warnings, _: X" s8 |+ n( C, h+ n* }
    warnings.filterwarnings("ignore")
    : @! K1 c8 \' H5 @! F" J1 Q- x! ~; E6 D: b  p
    要点
    / W8 b6 ~1 }2 d- ]# R; h- s5 t% g) P: c! Q; R$ H% r! o; Y& O
    1旋转图像现成的工具很多,一个是cv2提供的,主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图:
    ( u( O5 X" W( [+ t( [0 E
    2 P, P, ?, @! o, E' U$ Q4 T+ j" T4 {! ?
    3.png
    / }) h( L0 }" s, p- u' \
    1 d: U6 d  v1 {这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。( b6 X6 K3 a! Q9 B4 z

    7 n2 f" X9 b! h! u4 f$ V( P这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图, ?/ ~2 {4 Q- }/ t) h" M0 J
    2 K/ |( j1 K# S. U

    6 |* \7 t% f! t. W! F! u) |, c$ I 4.png
    " h8 t- g7 _" Z6 @. ^6 }+ r; \" m8 |1 q; J- N
    代码#! /usr/bin/env python
    ) J* t! H6 D) {, c' V( M# -*- coding: utf-8 -*-( r+ s7 I9 M' m; h. W/ y0 W2 }
    # ! python3
    ) p  Y, P8 f8 R5 T1 _' ?. b5 _$ P% M6 `0 ~8 S8 ^1 J
    import cv2
    ' d2 Z4 \  @; V9 e8 {* Mimport numpy as np9 G$ E. a: m- v
    from PIL import Image
    : b4 O# I( B/ c. h# H7 `from matplotlib import pyplot as plt% Q$ k2 F7 ^8 g0 A) O# n
    import matplotlib.image as mpimg* _) D( b$ p$ h: o# V( O

    & J8 w8 K" J$ Y) u. J2 rdef rotate_image(url):) i1 d* i- Y4 I: w$ L% i
            #旋转图像,并将其保存为4种角度的图片
    2 J5 u3 w0 Z# @" l% u  _4 L    im = Image.open(url,"r")# `3 z& M9 Z9 b% ^3 p
        im = im.convert('RGB')  #避免有些图报错
    $ E6 g6 K& f3 \. M9 g. x9 |% q    im.save('image_test/test_0.jpg')
    ' Y4 O: H$ ^1 s: u* M( B& {    im_90 = im.transpose(Image.ROTATE_90)7 @* b6 }0 A* {
        im_90.save('image_test/test_90.jpg')% ?* w9 V4 z: A( A/ c: q' }" O
        im_180 = im.transpose(Image.ROTATE_180)
    ; N( i7 o" R) M2 e' ~' s    im_180.save('image_test/test_180.jpg')/ E3 n4 S8 c6 X) X
        im_270 = im.transpose(Image.ROTATE_270)! r9 Y( q5 ~$ u. o) v  T' S
        im_270.save('image_test/test_270.jpg')% I1 J0 U! y3 n% r
    + N- X' \8 \# J4 G! U; B: I
    def plt_merge_img():
    9 ?/ \/ I/ z- M: M8 p/ j2 ~1 k        #将保存的四种角度的图片,叠加在同一张画布上( }6 l; v1 P- N* l' C
            #使用plt.figure()创建画布,并用add_axes()来分割区域显示图片
    8 p" C' }( E3 c! N! `( U' C        #显示画布,并将其保存为fig_size.png! F- L3 G) |+ B( y4 Q; g5 U
        img1 = mpimg.imread('image_test/test_0.jpg')
    + M: j& g1 w5 i. S3 J4 ~    img2 = mpimg.imread('image_test/test_90.jpg')
    2 `" d9 U# [, w, |    img3 = mpimg.imread('image_test/test_180.jpg'). e# ?" w' K! D' p; }
        img4 = mpimg.imread('image_test/test_270.jpg')1 H' y6 V; o* |7 C" s0 o6 ^
        fig = plt.figure(figsize=(60,59),dpi=96)3 F' _: Z! i) b# b

    / F8 C& f8 Q* Y# Y6 A#上方的横图
    8 Z1 ]+ ~# ~* c* P: Y) G    ax1 = fig.add_axes([0.30,0.55,0.42,0.28])9 h' ?$ z' w- A
        ax1.imshow(img1)
    # y, W& h, Q  Y7 g" O4 v    ax1.axis('off')
    3 K2 b$ u4 p5 l7 @% t  T3 F
    ; W# Z  V0 ]$ g3 `/ \# 右方的竖图
    : s+ V$ K5 _+ m# a1 I- e* k  P    ax4 = fig.add_axes([0.67, 0.29, 0.28, 0.42]): P6 G/ c3 h- w/ X2 |4 [8 ?
        ax4.imshow(img4)
    7 }% g" A+ V$ z    ax4.axis('off')! w3 J1 m( z6 d5 `% F. d% ?! R
    : u7 m6 i$ @5 [4 c6 U6 r
    # 下方的横图
    + M# X/ C# x; {) \. {    ax3 = fig.add_axes([0.30, 0.18, 0.42, 0.28])! L7 B1 S4 A7 C$ Q1 B/ L1 Q/ c  Z
        ax3.imshow(img3)
    & n! N% B( n+ N% P  Q8 u$ M    ax3.axis('off')5 M; `, F6 Z- j5 [; ]: j$ S( ~

    : O& ^' F: n; r#左方的竖图
    ; ^; y6 H( B; [9 ]! A) T    ax2 = fig.add_axes([0.07, 0.29, 0.28, 0.42])
    ( [) |: L" C* o  a8 w! O8 \    ax2.imshow(img2)
    & W5 z2 G2 R! X) ~9 }    ax2.axis('off')- v2 N  d1 h# a0 y; H
        # 保存为sig_size.png
    ( X) {, @8 D9 \! U    plt.savefig("fig_size.png",dpi=96)
    $ {' t  h- h5 E) g9 v+ ^0 @    plt.show()+ }2 O+ t3 G& v* G4 x
    ( R8 H8 }! i6 k0 g& s
    def main():$ _) J6 ?' |8 e8 O
        url = 'test_1.jpg'
    * x6 U% E9 p! @' Y- _+ Z- k) n! X/ _    rotate_image(url)
    ! d  q1 ~/ l* p8 o1 ]# s6 _( c+ U6 Y    plt_merge_img()
    % x4 O  _5 d0 o+ N" O/ X4 j# E& W. Y: d9 D$ q. I
    if __name__ == '__main__':1 Y9 V- ^  ~% v
        import warnings8 w& q7 |0 p& T. g* d* G
        warnings.filterwarnings("ignore")
    / D8 [7 C+ q1 G% D, s& Y( c+ `    main()8 ^( {. Y1 U/ }5 W6 S. v' I

    & t, a0 ^6 q: _+ Z" Y$ o/ O, h) t/ v————————————————& G" B; k. B6 I0 J4 }$ ]: y' v- r  x
    版权声明:本文为CSDN博主「你要啥自行车」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。# [$ n! [0 O0 z+ J2 M7 m
    原文链接:https://blog.csdn.net/weixin_42572826/article/details/1060337093 N% l) J5 A3 m; f

      g: L# Z8 a  S4 N4 n6 P
    8 n& m: t6 E0 L! F  f
    3 W2 |$ N. U, f/ C3 m6 }
    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-6-10 00:30 , Processed in 0.408499 second(s), 58 queries .

    回顶部