QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1622|回复: 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
    2 |, B4 f& Q" e
    python4次旋转图片后,多图叠加显示- B9 Q* p% V, F  x/ t
    [color=rgba(0, 0, 0, 0.74902)]文章目录
      7 a  E% _8 S' E2 V, n, Z5 `( E
      • 想要的效果对比,原图VS显示
      • 问题
      • 要点
      • 代码2 D+ `" c6 b$ d. `8 ?0 I/ ?

    , X$ `. r1 |, S7 |. {. x1 O" N5 w4 \! ?
    [color=rgba(0, 0, 0, 0.74902)]前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog( F3 e7 n  c7 A
    想要的效果对比,原图VS显示 1.jpg 1.jpg
    7 F# k' ]7 Z2 S# `$ i' A) K9 T8 ^% i0 ^- a  e" x* V

    4 @5 G! K7 n7 T+ L' ~* Z2 ~7 r问题
    3 m% v( M8 S: V! n7 Q, ^# C$ _7 s  Q( D/ [, C$ f& F5 m
    (1)在刚写出来时,在rotate_image()函数中没有加,im = im.convert(‘RGB’)这句话,就会出现有的图正常,但是有的图报错,无法保存,并显示下面这句话
    9 e, P- s1 j0 O8 M6 A" u' S' `, _- g2 D' w4 |! f
    这个问题可以在这一篇blog找到解决方法。就是im.read(url)后,再将图片转换为RGB格式(image.convert(‘RGB’))。这样就可以避免很多因图片导致的问题
    & Q/ A% r2 F5 x! W8 N. v# V- ?. k  a* }7 B" Y# \% B% f
    (2)在matlabplot中,显示图的第一步是创建画布,plt.figure(),然后在画布上添加子图,最后显示整个画布的图像时,并且让子图自适应来显示。而我遇到了这个就是关于self.figure.tight_layout()的警告,见下图。
    " D: n3 N8 I& @9 a: T3 K9 N( h# n' I) d" K0 U9 N# ?
    一般在使用plt创建一个画布后,程序本身会有一个自动调整子图尺寸来使用画布的情况,但是因为我是显示图片,所以这个自适应就出问题了。但是还好,只是警告,不是报错,为了方便,忽略就好…(但是我不推荐这种做法,希望有人研究一下,并把解决问题告诉我)5 f- r% Q. W! M3 t! S' G9 t, P
    为了方便,我直接在一开始加上下面这句,忽略掉。
    * H5 ?/ F- V" H. [4 {! v6 ximport warnings" K/ d. s% `' @! f9 R# w
    warnings.filterwarnings("ignore")6 j# d: q3 E0 H8 M' D) s6 j! e
    ' R# f* W- |, o/ j2 u
    要点
    3 `1 _* ~4 N* y2 A  z' k9 \
    . T! G2 A/ a, l' }" I! \: @7 I1旋转图像现成的工具很多,一个是cv2提供的,主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图:
    ( i8 P! d, Z/ Y1 h4 S9 N5 h' h& M! ~  C1 D, }/ P' I% j8 T4 W
    " l4 d: A  {3 R% b, L& I; b
    3.png / g5 D- b9 A* a' M4 p* `! ^

    % C0 }% E* j0 P, y' j这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。
    1 J; ^9 M( {" T1 ]0 _2 t2 w
    " Q' ]5 `- f+ x7 w9 M! _这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图& o  f4 w: K0 ~9 O

    - N9 t0 [! u; q! N9 _  b0 r
    9 p+ k& u4 w5 M% L+ U) s) H 4.png
    $ V9 z6 y, I2 k1 `# y
    ' m  @/ x0 V, T3 \' s3 s" J! v代码#! /usr/bin/env python
    2 t1 p- Z4 H+ x" {4 H- F# -*- coding: utf-8 -*-
    % L" z3 f) G* a& p' Q/ o* t3 g# |# ! python3
    ' t/ U/ R$ l7 i
    ; Z3 p) K1 v: D& Yimport cv2  O8 Q3 }2 W5 f2 Z: }
    import numpy as np
    ; r! x5 G1 X; {6 V. O* ~from PIL import Image
    ; q0 O6 @0 \1 F+ u7 h; B( E4 Yfrom matplotlib import pyplot as plt# z1 U' [9 z1 |6 n
    import matplotlib.image as mpimg
    - a$ y' u/ Y* ]
    " a4 C- T/ [0 C( Edef rotate_image(url):6 l4 s  G9 c9 K. k+ E! n$ Z
            #旋转图像,并将其保存为4种角度的图片
    9 w4 B  E3 ^0 [3 p, K$ Q    im = Image.open(url,"r")& T, h+ x9 [4 O  U. I
        im = im.convert('RGB')  #避免有些图报错 : L" p$ }" c4 U
        im.save('image_test/test_0.jpg')
    : H  m( Y" U6 }# }, C, E    im_90 = im.transpose(Image.ROTATE_90); L. Q! c0 N' v
        im_90.save('image_test/test_90.jpg')
    ! g4 b$ Z$ }8 B1 R7 E3 [4 t    im_180 = im.transpose(Image.ROTATE_180)
    - U+ j. l' p8 a" S+ z) |; [    im_180.save('image_test/test_180.jpg')
    & Q; r6 I7 v& j$ H+ F5 {' U; D! T    im_270 = im.transpose(Image.ROTATE_270)+ l9 J. j, l3 ]9 F. c
        im_270.save('image_test/test_270.jpg')& Q8 e! T. X9 i) B% ?/ m
    7 m+ G7 `+ N& y7 y8 O" Z) o
    def plt_merge_img():* E: o; t! O9 u  Y+ a
            #将保存的四种角度的图片,叠加在同一张画布上( ?+ q  X) j# ]; I) j# x% B
            #使用plt.figure()创建画布,并用add_axes()来分割区域显示图片
    ' l4 c6 q  X3 Z) s9 O8 S        #显示画布,并将其保存为fig_size.png
    2 a4 [+ p1 S" Q8 @( v* \    img1 = mpimg.imread('image_test/test_0.jpg')
    6 ~$ _  N/ D: @) [  X" [    img2 = mpimg.imread('image_test/test_90.jpg')
    . W6 G0 z1 e( _) [; Z$ k& `0 ?    img3 = mpimg.imread('image_test/test_180.jpg')
    ) o/ w  n6 `2 @* O2 s/ I    img4 = mpimg.imread('image_test/test_270.jpg')+ m  C& B3 w# D6 n7 }6 e5 }; y
        fig = plt.figure(figsize=(60,59),dpi=96)
    % n8 R' u; ~! F8 C
    # A) t/ L2 b9 _) Z+ d1 ?#上方的横图
    5 h* H3 C, |& z& i: A* ]    ax1 = fig.add_axes([0.30,0.55,0.42,0.28])/ A: S  m7 |1 A: x3 W. d% Y
        ax1.imshow(img1)# f# h/ E2 z/ F; V& h0 Z5 V; K
        ax1.axis('off')
    ( u( s3 p; Y6 r2 F* A% {! |
    3 \9 T* @# V" u# 右方的竖图
    5 H; Y+ r1 x  ?3 Y0 Z+ G2 T. z    ax4 = fig.add_axes([0.67, 0.29, 0.28, 0.42])7 }, G3 c, K9 a9 ?# X! t+ s  p# B
        ax4.imshow(img4)
    ( w3 M9 ^+ {, \1 q1 Y    ax4.axis('off')
    , v+ f0 ^" I8 }2 K1 e0 E& Y: y3 f: h
    # 下方的横图
    ' e" u  K$ m1 ^    ax3 = fig.add_axes([0.30, 0.18, 0.42, 0.28])
    5 R4 A) ~1 N% f$ e    ax3.imshow(img3)
    ) ^$ X: `* G" F- Z9 t    ax3.axis('off')6 T1 w2 b4 I7 d1 h0 x0 {
    ' F  R: `4 h4 \5 s
    #左方的竖图4 q, P) M  l. u8 Y
        ax2 = fig.add_axes([0.07, 0.29, 0.28, 0.42])" I0 P, y7 Y  a; L% f
        ax2.imshow(img2)
    + ~/ h4 k7 X; r    ax2.axis('off')
    ; _- U$ t/ p1 p1 n) l+ f    # 保存为sig_size.png4 J# W2 V+ A: ?% ~' l
        plt.savefig("fig_size.png",dpi=96)
    & g) E* Q2 I: N( N( }  N: G. v8 ~    plt.show()
    + L: Z7 D" [0 u2 x% E3 r' B6 J8 n# n; w4 [  j- f
    def main():/ f9 W8 @! f0 u$ ^3 t
        url = 'test_1.jpg'
    . X$ p. |3 v4 |    rotate_image(url). L/ ]7 T. x/ D1 {
        plt_merge_img()
    / `/ W8 {0 U# U+ j
    , v5 f2 v$ E4 ?9 S; lif __name__ == '__main__':
    ! V3 t4 C. x: e2 r! F    import warnings9 K5 f2 N; p, d# B  r& g
        warnings.filterwarnings("ignore")
    5 Y7 `0 }# @7 g3 }% e, k    main()
    , ~6 Z" u; u' B7 i0 l  L" ~; O) l; R" H1 k: ?  h" u$ g5 {
    ————————————————0 _7 l" g% Y& ]: r
    版权声明:本文为CSDN博主「你要啥自行车」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    1 @" ~# @  ?; @# Y: w$ |( x) p& U原文链接:https://blog.csdn.net/weixin_42572826/article/details/106033709
    * e% X5 c% d/ \7 i# L5 h$ e: U
    " i' Q" p7 m3 Y9 M3 t+ F
    7 I! v/ M8 c& ^( a; O$ J: o! Q) x
    9 D# I& P! a6 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-6-13 04:29 , Processed in 0.385962 second(s), 58 queries .

    回顶部