QQ登录

只需要一步,快速开始

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

    ; b* Q' t- v) f7 I1 F0 Wpython4次旋转图片后,多图叠加显示* A/ l* e9 t$ Z' u: @9 S0 h
    [color=rgba(0, 0, 0, 0.74902)]文章目录

      & M! N- ?+ {/ N8 R. A7 K* ~
      • 想要的效果对比,原图VS显示
      • 问题
      • 要点
      • 代码
        5 _/ i3 E( j* h1 r. h$ `$ n: i, \

    8 K9 G6 O5 ^/ q% u( D% v7 ?4 _" H  l7 c3 U$ Q
    [color=rgba(0, 0, 0, 0.74902)]前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog2 m. u1 e& d9 S/ m  N. Z5 `
    想要的效果对比,原图VS显示 1.jpg 1.jpg 8 n  v- S9 ?* K' ^* s9 V

    ' t9 q  r- B1 f9 O3 y- F* u) [; l4 C" c- z; l6 m
    问题2 {$ U( t4 G7 a" R
    3 Y, O9 ~5 p3 y/ J3 P9 {
    (1)在刚写出来时,在rotate_image()函数中没有加,im = im.convert(‘RGB’)这句话,就会出现有的图正常,但是有的图报错,无法保存,并显示下面这句话
    ' ~$ Q- {6 R  X( d; C4 i# L+ P/ o' G: E
    这个问题可以在这一篇blog找到解决方法。就是im.read(url)后,再将图片转换为RGB格式(image.convert(‘RGB’))。这样就可以避免很多因图片导致的问题
    - V* T6 O; B' W- X# j8 [; a1 G
    5 z) Z4 f6 G/ V! L9 _, Z" t" x  D(2)在matlabplot中,显示图的第一步是创建画布,plt.figure(),然后在画布上添加子图,最后显示整个画布的图像时,并且让子图自适应来显示。而我遇到了这个就是关于self.figure.tight_layout()的警告,见下图。
    2 ?2 O* \' N- @* B7 v/ Q
    % }3 d2 m& b8 p: L% S( g一般在使用plt创建一个画布后,程序本身会有一个自动调整子图尺寸来使用画布的情况,但是因为我是显示图片,所以这个自适应就出问题了。但是还好,只是警告,不是报错,为了方便,忽略就好…(但是我不推荐这种做法,希望有人研究一下,并把解决问题告诉我)
    0 s7 L4 J7 W6 e/ y1 V1 K, J% [/ |为了方便,我直接在一开始加上下面这句,忽略掉。
    - n0 G0 G8 d# I/ Qimport warnings
    ) R6 e( n9 M6 d' twarnings.filterwarnings("ignore")
    . G: d7 E- l2 |' c, i
    7 Q) c/ q% H- v$ E# F5 [1 R2 a9 W" r要点
    7 y( ~- s% l9 V6 l( _1 h8 K4 N& E8 a* N  a2 t" |# o
    1旋转图像现成的工具很多,一个是cv2提供的,主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图:0 A& g6 _3 ~( a2 D2 V7 v
    0 C6 P3 q4 X* e2 _6 Y

    ' j- |. N9 Q, h  O: e4 R. M$ ] 3.png
    " U; z7 ^) ^$ P- H
    2 M( r; d  ], Y8 l这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。# h2 e  H% }/ q+ v2 f

    0 S! v, r! |4 {这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图
    1 }. ]9 L2 I! a1 u+ i9 Q5 O1 G& B6 c3 m2 p$ q! A7 |+ y* ?
    7 i6 m7 F2 _) X$ g+ r) x( c; {
    4.png
    * b+ \, F+ Z/ B8 K
    $ I9 N6 ?/ p( V( d! ~! k# U代码#! /usr/bin/env python
    0 n: z% x: y6 y( `# -*- coding: utf-8 -*-
      f) |' K4 y: c0 B: Z& l# ! python3
    . X; p5 G0 h8 |4 b! q: E8 ?$ i% s) a4 N. R( v* [0 Q* r
    import cv2; B# V9 T( ^, ~9 }$ e! b2 J
    import numpy as np# g* I, |) H" J- |
    from PIL import Image( u. ^3 P9 E$ E* J: ]5 y
    from matplotlib import pyplot as plt( b: \; z% y& E  r* e+ e! ^
    import matplotlib.image as mpimg
    9 }, N9 X( X% R) h5 Q
    % d' ~% _( r6 sdef rotate_image(url):
    # @7 y; h; U2 `& b* U% A        #旋转图像,并将其保存为4种角度的图片- P3 v: e: n$ k1 \
        im = Image.open(url,"r")
    5 l$ v6 D6 `) [7 J    im = im.convert('RGB')  #避免有些图报错
    , \4 b# Q+ Y3 L. F    im.save('image_test/test_0.jpg'). a% l: g7 w$ A3 E, y$ C1 Q$ l& o
        im_90 = im.transpose(Image.ROTATE_90)
    7 }3 {0 A! g* t8 x+ V    im_90.save('image_test/test_90.jpg')
    0 O) r! l5 Q1 o    im_180 = im.transpose(Image.ROTATE_180)
    1 u; q2 f/ t; y' O    im_180.save('image_test/test_180.jpg')
    # ^0 \6 U1 m2 {7 g0 k0 L    im_270 = im.transpose(Image.ROTATE_270)
    7 L* s3 s, p5 J    im_270.save('image_test/test_270.jpg')5 t8 U, D2 p6 h- e5 t

    3 O5 Z7 M3 o9 W* Qdef plt_merge_img():5 c! G8 P: l; f  D! ~; v5 G
            #将保存的四种角度的图片,叠加在同一张画布上9 u9 u# z7 R6 [8 u/ G8 ~, l2 R1 P
            #使用plt.figure()创建画布,并用add_axes()来分割区域显示图片9 R; f& I0 Y& l; Z+ Q8 f4 [  A9 e
            #显示画布,并将其保存为fig_size.png8 B2 o) n- [5 d& L* S0 v  V
        img1 = mpimg.imread('image_test/test_0.jpg'), j) F8 L2 j1 q" h! w+ f" Z
        img2 = mpimg.imread('image_test/test_90.jpg')5 u8 e$ S8 j5 |
        img3 = mpimg.imread('image_test/test_180.jpg')& Q$ Z; o& y& u9 |6 D9 f. O
        img4 = mpimg.imread('image_test/test_270.jpg')
    9 c# T! J6 @- ~: F, s* T    fig = plt.figure(figsize=(60,59),dpi=96)9 P6 ]: b+ B! g* u, q
    ' w) \& g  f3 v( {1 Q# _
    #上方的横图
    3 {" B- D0 @& |( M# k8 r    ax1 = fig.add_axes([0.30,0.55,0.42,0.28])
    : s$ l) J8 ]( k4 x2 Q4 F3 h, G' q- z    ax1.imshow(img1)
    2 v# U1 g  H" W" m1 o+ V8 L3 Y    ax1.axis('off')
    3 t9 W( C9 N5 U, r; `1 y) E1 J3 L4 ?/ \# T4 s: h
    # 右方的竖图$ K" H3 _4 w' t- p
        ax4 = fig.add_axes([0.67, 0.29, 0.28, 0.42])
    $ w5 `6 f3 I2 L/ `4 `    ax4.imshow(img4)5 U0 B% W5 i" j8 _
        ax4.axis('off')
    ; y2 [, o4 Y: }9 J( o. c9 F+ K- W
    # 下方的横图
    8 E# K* v/ G* F0 F: p9 q; C    ax3 = fig.add_axes([0.30, 0.18, 0.42, 0.28])/ @6 m3 f) J# |: H
        ax3.imshow(img3)$ p2 }3 F: u9 j$ v% F9 N5 C& @
        ax3.axis('off')
    4 z; _: S5 l9 O7 O3 `" w
      ^) I, `. T1 w7 J#左方的竖图
    / s+ |+ n0 ~2 B$ t" J    ax2 = fig.add_axes([0.07, 0.29, 0.28, 0.42])" m' y' j5 E7 l& ?/ t5 Y4 H5 P
        ax2.imshow(img2)
    ; U, A! c, Q8 S8 n5 a$ z1 G1 q; a    ax2.axis('off')  X5 ^) A; c9 p. J6 J$ L
        # 保存为sig_size.png
    9 {! J9 P# Y7 ~- H) U, L    plt.savefig("fig_size.png",dpi=96)
    ' B# d6 N/ w' _! G7 F    plt.show()
    4 \* v# @9 f" C
    ; @7 }$ V2 X& z5 x/ Fdef main():
    . b1 u- a" T. U( e8 p: a" ^    url = 'test_1.jpg'
    3 v% g! B$ |7 o1 L7 R    rotate_image(url)) q9 b& G" z2 z8 O' Z  i5 [
        plt_merge_img()
    + h  C: b$ i7 _# R7 e$ P
    ( l; @9 u8 K# P" N! e) @if __name__ == '__main__':. j7 \8 J# y+ t* O' O* [$ b
        import warnings
    6 u1 l$ V* {( c" d- c1 u" U    warnings.filterwarnings("ignore")8 V4 @4 Z( \1 ], B& e7 y
        main()$ u4 ^# S5 J& q/ P+ g4 t  A

    - e) h" |4 Q; ]————————————————
    * S* G- T9 S7 f0 R+ W7 r/ O版权声明:本文为CSDN博主「你要啥自行车」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。9 `4 ^) O+ {# M8 y
    原文链接:https://blog.csdn.net/weixin_42572826/article/details/106033709
    ! I6 h4 e" R& C/ v; x' N6 ?! ^% f0 c) Z  P
    ( n0 K+ y# M9 {. u5 h" T- i
    * W5 v$ K; C. ^0 Y9 C. s
    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, 2025-8-20 00:23 , Processed in 0.518988 second(s), 59 queries .

    回顶部