QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1650|回复: 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
    + H: r7 D1 Z$ Q: _& P/ `% a
    python4次旋转图片后,多图叠加显示2 E, A( V( o% n2 `- J8 O' v: }
    [color=rgba(0, 0, 0, 0.74902)]文章目录
      ' F; m' N9 m1 W8 a
      • 想要的效果对比,原图VS显示
      • 问题
      • 要点
      • 代码3 D0 v5 P3 z) g8 V6 ?, W/ `2 x
    ' P  y" `7 c; ^
    0 B3 ^( b! `5 V4 D. C
    [color=rgba(0, 0, 0, 0.74902)]前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog
    # n' g" c( `% U4 {( c9 R0 t- V- ]5 t想要的效果对比,原图VS显示 1.jpg 1.jpg ) w6 u. J3 `* M" ?) l2 [

    ( v6 G; ]9 u9 [) ~( Y. y! h6 o5 J
    6 C( D* i/ ]! J问题
    ) ^' L% |, t! o( K# ^7 T5 N0 I  N5 f" f
    (1)在刚写出来时,在rotate_image()函数中没有加,im = im.convert(‘RGB’)这句话,就会出现有的图正常,但是有的图报错,无法保存,并显示下面这句话, C3 V7 f4 m, M7 x: T* d

    * b# w. k$ k8 ?3 n2 ]) i. o+ `这个问题可以在这一篇blog找到解决方法。就是im.read(url)后,再将图片转换为RGB格式(image.convert(‘RGB’))。这样就可以避免很多因图片导致的问题& P) B1 f9 \2 L, p2 }: x0 f

    $ u2 |. k  F) u3 h9 [(2)在matlabplot中,显示图的第一步是创建画布,plt.figure(),然后在画布上添加子图,最后显示整个画布的图像时,并且让子图自适应来显示。而我遇到了这个就是关于self.figure.tight_layout()的警告,见下图。
    / a  l* |$ Q  z* U
    : ^7 W( `! L0 o0 a一般在使用plt创建一个画布后,程序本身会有一个自动调整子图尺寸来使用画布的情况,但是因为我是显示图片,所以这个自适应就出问题了。但是还好,只是警告,不是报错,为了方便,忽略就好…(但是我不推荐这种做法,希望有人研究一下,并把解决问题告诉我)
    " O5 F+ V8 n- c) R1 L& @6 Q为了方便,我直接在一开始加上下面这句,忽略掉。. O1 p( R& U, {( c4 p
    import warnings0 m3 ^4 s  X: S+ J7 a
    warnings.filterwarnings("ignore")# s( |$ @1 R0 ~+ @
    - V, n/ @  C. @& c7 G; n
    要点
    6 X* l' j# q$ k& q" p5 r; N3 e! d( k
    1旋转图像现成的工具很多,一个是cv2提供的,主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图:
    % B' p* [+ {% d0 @& ~% \+ K- r$ R$ U, s  U2 w

    $ E6 t+ J$ _$ C! E: E 3.png 2 e. a) j6 a, K
      S; ^2 ?7 u; j' |5 B% c  P
    这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。9 }$ E) N5 g$ r( [% B# z( ?( B

    3 O  y7 n# {5 U2 M这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图8 g$ K8 f* S/ g& l$ g; @0 u

    * P, L( h4 x* D- X) G) z& _+ R; E& H& d) `2 u, M
    4.png
    6 _! h; v& C3 R% p; X. I& {! j( c! v) `$ V, x. p* C1 `8 M2 a
    代码#! /usr/bin/env python
    4 G* t4 N* V9 ]1 f- k& f* x# -*- coding: utf-8 -*-
    ( T- N% q9 C4 h- {4 W& `) B  p# ! python31 S! d% R, M/ W3 _, Q5 w. \0 f

    5 `+ p8 M: }% Vimport cv2
    ) }& X! k6 E" ?* ~" jimport numpy as np
    - y+ |$ L/ T) Y* ofrom PIL import Image
    + z) W5 v( X3 @( w0 T* F# rfrom matplotlib import pyplot as plt/ k) d3 \+ L2 L  m7 Z# a
    import matplotlib.image as mpimg4 V( X! g- N' o' P; t. O: [
    / O' y& M7 _8 ~: E) P6 G
    def rotate_image(url):2 h6 L2 i" ?4 b# R; H8 m7 }( P9 e$ \
            #旋转图像,并将其保存为4种角度的图片3 }, P( p4 Q4 k- S0 ^5 q
        im = Image.open(url,"r")
    1 h& n( c* m# L/ [0 O. m7 `% @" w8 ~    im = im.convert('RGB')  #避免有些图报错 - J) s: k8 E- D! p
        im.save('image_test/test_0.jpg')% P* a' e9 U$ p2 A
        im_90 = im.transpose(Image.ROTATE_90)- m! ^  }+ M$ R- ~* `8 R+ Q
        im_90.save('image_test/test_90.jpg')  M8 I  W, h. U5 r/ F) f
        im_180 = im.transpose(Image.ROTATE_180)- z1 _2 O# g/ ?
        im_180.save('image_test/test_180.jpg')3 m$ T. c1 b& b8 G6 }# J
        im_270 = im.transpose(Image.ROTATE_270)
    $ r  H# m2 V" u' @: O    im_270.save('image_test/test_270.jpg')/ H- n$ }, R1 m  c/ [* U5 [' f

    3 q, y3 D  G; n, Odef plt_merge_img():
    5 l5 c6 f& m) w5 i+ w0 u" J        #将保存的四种角度的图片,叠加在同一张画布上1 `7 Z* o6 u9 l0 y" }$ [& X6 ]
            #使用plt.figure()创建画布,并用add_axes()来分割区域显示图片1 t, L. G  d% N  m# K
            #显示画布,并将其保存为fig_size.png
    / `  O0 s- _8 P% h    img1 = mpimg.imread('image_test/test_0.jpg')  p4 \% `$ l% |) c2 a! I3 z" I
        img2 = mpimg.imread('image_test/test_90.jpg')  f6 V7 V4 m* j9 M* @
        img3 = mpimg.imread('image_test/test_180.jpg')+ m/ L4 \& K/ M& _$ M+ l) [
        img4 = mpimg.imread('image_test/test_270.jpg')" |; }/ v7 p) H
        fig = plt.figure(figsize=(60,59),dpi=96)5 j1 y" R& [: h/ ?+ C$ s, q! `+ E0 T

    0 `' G1 n  j" `" H/ l#上方的横图( A4 z/ R8 @" f- l* w* Q2 H7 ]
        ax1 = fig.add_axes([0.30,0.55,0.42,0.28])2 [: U7 W* |: m
        ax1.imshow(img1)
    8 y, i; S+ d2 ?) q    ax1.axis('off')
    $ L/ ]4 D* `6 e+ k3 b  k
    ! E$ C$ k/ ~! w! D" j3 A/ S# 右方的竖图2 N; c! o# j2 F/ x; l
        ax4 = fig.add_axes([0.67, 0.29, 0.28, 0.42])0 G7 x2 t7 ~- C8 P, y5 e
        ax4.imshow(img4)
    % o8 s3 s& x# L5 [& l' X1 L    ax4.axis('off')
    ) {) p- ^5 ^2 C' ]- F& q1 w% ^2 W( L1 }# U+ P: u; O6 ^
    # 下方的横图
    / b# X. B, T. J! H; i3 x$ L3 \3 i    ax3 = fig.add_axes([0.30, 0.18, 0.42, 0.28])
    . {1 o) {% q! k1 H! V2 L    ax3.imshow(img3)" R7 G( U/ q# E% ~, U: Y6 n$ u
        ax3.axis('off'); a) z3 E' R% \+ C2 i
    # a9 Q# u: I. Z. M0 e
    #左方的竖图2 p8 J+ |3 m; }, J) V
        ax2 = fig.add_axes([0.07, 0.29, 0.28, 0.42])  O7 i- d' f- F7 L4 U
        ax2.imshow(img2)9 |  u" R6 L3 _& o8 f( Z; j
        ax2.axis('off')
    ! _5 [3 r9 J* z# A' _    # 保存为sig_size.png
    5 C# e! |  [" Z2 S+ s" P, l    plt.savefig("fig_size.png",dpi=96)# Q6 c7 T2 x, a* x7 \% Z" c& ~
        plt.show()/ g5 i+ n- R3 d  x9 L
    " @+ p' h1 x7 y6 L0 j, i
    def main():3 x0 ~) ]( l2 c! |% V
        url = 'test_1.jpg'
    # H* T  j5 _/ ?5 U    rotate_image(url); m$ F; `' {, L, j4 Z4 I5 g
        plt_merge_img()8 M6 U8 F" E1 e, U

    * ]7 e. x8 p5 ?% wif __name__ == '__main__':; w/ \6 C: E( o5 ]# [8 z
        import warnings3 i% k8 V9 H" b+ n# Q0 f
        warnings.filterwarnings("ignore")6 _" j5 e# t4 f2 I& w+ O
        main()
    7 P! Z7 C, ]& G$ l: J; g. Q7 J4 H
    8 @2 X1 c' z' X3 L8 Y' I! Q, j# ?% a————————————————3 P* C2 ?2 Z; U- X7 s
    版权声明:本文为CSDN博主「你要啥自行车」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    8 m) P) ?  `& N" ~# G原文链接:https://blog.csdn.net/weixin_42572826/article/details/106033709
    7 i1 B$ m. G! Q; ?1 c1 C. ^8 P  F/ \
    2 O0 @5 I% q5 J. ?0 X( G$ R

      c4 H3 {! T" Z: O. 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, 2026-7-26 03:01 , Processed in 0.450691 second(s), 59 queries .

    回顶部