QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1582|回复: 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/ \0 C' G0 _8 t$ B6 t. p
    python4次旋转图片后,多图叠加显示
    ) p9 x! v: C7 ^3 l4 k$ `7 r[color=rgba(0, 0, 0, 0.74902)]文章目录
      ( j) }& U; Y5 {/ z9 m
      • 想要的效果对比,原图VS显示
      • 问题
      • 要点
      • 代码
        6 g6 `. F2 J$ w

    & T+ V& P, q2 @  U: p* N4 z" \# U
    " P1 d( k3 @6 l0 D8 _( R[color=rgba(0, 0, 0, 0.74902)]前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog
    # p$ ~( J( I2 t  y想要的效果对比,原图VS显示 1.jpg 1.jpg 8 S, e1 w; L/ S" h5 y

    5 V5 w8 c; T. |1 \7 W
      Q% d0 R3 L9 K- z( w问题
    " G6 z) g" W. }# z9 \6 s
    " i: u# }0 w9 M0 `3 W& {% Z: b% F(1)在刚写出来时,在rotate_image()函数中没有加,im = im.convert(‘RGB’)这句话,就会出现有的图正常,但是有的图报错,无法保存,并显示下面这句话' j, x3 f6 C# o7 ^  |9 o( F
    ( ~2 c+ U4 Z4 f# s( K
    这个问题可以在这一篇blog找到解决方法。就是im.read(url)后,再将图片转换为RGB格式(image.convert(‘RGB’))。这样就可以避免很多因图片导致的问题5 K8 Q! X2 r  l0 n
    & x; B* {9 p4 v6 ^) A% n$ M: x
    (2)在matlabplot中,显示图的第一步是创建画布,plt.figure(),然后在画布上添加子图,最后显示整个画布的图像时,并且让子图自适应来显示。而我遇到了这个就是关于self.figure.tight_layout()的警告,见下图。( g; s; n; @% N9 `: O% i& J
    $ t4 E# D) A1 f4 c. k! _* |0 o( i
    一般在使用plt创建一个画布后,程序本身会有一个自动调整子图尺寸来使用画布的情况,但是因为我是显示图片,所以这个自适应就出问题了。但是还好,只是警告,不是报错,为了方便,忽略就好…(但是我不推荐这种做法,希望有人研究一下,并把解决问题告诉我)
    ( P. A- b- b# B; H为了方便,我直接在一开始加上下面这句,忽略掉。
    : z. g0 U8 y1 b6 E# @import warnings$ d# e. V1 U+ T. v
    warnings.filterwarnings("ignore")
    ' i* z5 w* z$ n5 Q& r8 M2 _
    / w; s  l, T& G) E' t要点7 k0 e/ g) n$ E6 N$ Z5 Z3 l
    * M7 u9 E0 ~4 v
    1旋转图像现成的工具很多,一个是cv2提供的,主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图:
    / G& ^/ n# F2 g% E) f, ~$ U+ N9 D% ~  n3 R% N5 ^. k/ q

      z2 n! V9 ^8 L  v5 @ 3.png
    " g% B- P' Q5 b, U9 _. m$ w9 w. i/ G" {/ N6 o
    这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。: D5 K/ q: y1 J0 ]9 \
    % O/ W( v: j& R: G+ u2 L, a
    这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图
    * H: @. c) z5 p% ^) C; ]; o
    " v- B/ x5 m  _/ u, s* R0 p
    & y& M, Y# z9 X# w5 ] 4.png 7 R6 k8 R3 k( j  ~- Y& N
    9 c( N7 K9 e, y- r- M& O1 ~4 t" V
    代码#! /usr/bin/env python
    & \! U, i' S/ C1 \8 X# -*- coding: utf-8 -*-
    1 V) T1 L9 m5 Y* ]5 l( c+ B- p6 ?# ! python3. _+ a) o, J; x) V, g, I/ s
    % H) r4 {5 l3 d+ _( W5 o
    import cv29 R+ Z' i9 [0 a$ ?' h+ P* [2 b
    import numpy as np
    7 v& f! N: {1 ]( m- Qfrom PIL import Image
    : j1 n+ r, \9 p; A; o# _7 m/ R3 Hfrom matplotlib import pyplot as plt
    % a/ h) Z9 V8 M- M! x. Aimport matplotlib.image as mpimg% ?) i6 l4 O& p2 Y! @( i

    + o9 i: j; O& \1 Z/ w* u3 L- {def rotate_image(url):, ^5 ~/ u6 K6 A0 t- u) e, r9 S" T
            #旋转图像,并将其保存为4种角度的图片/ s" i3 _/ {4 F% B) C
        im = Image.open(url,"r")  e. T  P" y1 Q
        im = im.convert('RGB')  #避免有些图报错
    ) ~: w! y5 T' t" }/ @5 H) ^  y    im.save('image_test/test_0.jpg')
    # }3 H8 h! U/ l8 {& R    im_90 = im.transpose(Image.ROTATE_90)
    2 X& B, U! t7 _% \  A/ `; c    im_90.save('image_test/test_90.jpg')
    / c- a4 _- u4 g    im_180 = im.transpose(Image.ROTATE_180)  V! k$ Y% R$ ^
        im_180.save('image_test/test_180.jpg')2 i7 D8 g+ _! `# ~
        im_270 = im.transpose(Image.ROTATE_270)+ j& z% _3 ]5 @, `4 w" ?0 e. x
        im_270.save('image_test/test_270.jpg')) }: F/ Q" `( }$ h7 j

    , B! m6 ?. `5 p8 }% W8 K8 mdef plt_merge_img():
    3 F& {) ~; Z; x4 [! u3 ~, G2 L        #将保存的四种角度的图片,叠加在同一张画布上8 z+ l; t9 i. K5 x8 l8 G+ Z. [  d2 @1 J
            #使用plt.figure()创建画布,并用add_axes()来分割区域显示图片
    ! @; B0 W  E4 K4 S' Q; Y        #显示画布,并将其保存为fig_size.png4 C" v8 K) H% r/ {# b9 e
        img1 = mpimg.imread('image_test/test_0.jpg')* w) \( n6 H7 C2 f: i7 d
        img2 = mpimg.imread('image_test/test_90.jpg')0 m) w3 W2 ^( u0 |2 Q
        img3 = mpimg.imread('image_test/test_180.jpg')$ w1 o4 T! D) r7 {
        img4 = mpimg.imread('image_test/test_270.jpg')! V7 ~' \$ c1 C% K9 T" k2 q; I
        fig = plt.figure(figsize=(60,59),dpi=96)  L0 i+ P8 [4 Z8 M  x7 U
    ( q: Q: e2 z( Q6 Q
    #上方的横图+ _/ r0 U  q3 a- s
        ax1 = fig.add_axes([0.30,0.55,0.42,0.28])
    , O) l, A" G" G' N    ax1.imshow(img1)
      r; c& s+ T7 h    ax1.axis('off')8 k; D7 K' f7 w+ `* K

    - r. i0 l) H$ m/ ?  W5 |  V& V6 n2 m# 右方的竖图, U3 Q  |& r; p& R
        ax4 = fig.add_axes([0.67, 0.29, 0.28, 0.42])
    * P( Q! h" B! ]: |    ax4.imshow(img4)9 E3 R+ \9 C- {& f/ p# A; t
        ax4.axis('off')
    6 ?6 e5 N/ K& }. E9 D% V
    % f- n7 A9 N1 o( l0 Z# 下方的横图
    + \) {* r* l4 J1 A# ~) O, X+ U    ax3 = fig.add_axes([0.30, 0.18, 0.42, 0.28]): R  c$ ~# C* d3 h# r
        ax3.imshow(img3)' U! I, H4 G6 A% l9 r
        ax3.axis('off')& Y0 X; ]  A: T/ R

    : W+ T; F6 t3 Q- [9 U6 X* n7 X#左方的竖图  p/ Z# {* e" r2 g1 d5 U
        ax2 = fig.add_axes([0.07, 0.29, 0.28, 0.42])
    2 F4 T' O- n( n7 I    ax2.imshow(img2)- X6 m7 g7 y% ?  Y) u6 |1 ]+ ?6 z
        ax2.axis('off')
    # Q# d( N# t  T# g; P3 `) |    # 保存为sig_size.png
    8 [9 ^( P+ N9 I. M8 T$ l8 k    plt.savefig("fig_size.png",dpi=96)/ j+ i- X! o7 N' p
        plt.show()# E' S: Q- ?1 r. @* L  T

    # P! S) \6 N  s, kdef main():) Y3 V7 ]3 G/ D  v
        url = 'test_1.jpg'
    6 ?! y6 g0 R' L5 D! y    rotate_image(url)
    ' k) G6 b+ ~8 D, M    plt_merge_img()
    % X& {! d$ h7 s0 R4 }/ ^3 Q" a9 @; p2 q# x
    if __name__ == '__main__':
    5 t2 M; ~: u, o0 i% x' w$ U    import warnings
    * u$ a; z5 ?/ O% }, x# \4 p! O* A1 O7 w' q    warnings.filterwarnings("ignore")* d, D6 Q- E4 Q" ]/ e  a
        main()6 C$ K1 F# Z+ p
    ( v( w& g) k/ t' U# ~1 ~
    ————————————————6 D, |# c$ a- X1 N. F. p5 T$ E5 M5 N
    版权声明:本文为CSDN博主「你要啥自行车」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    1 `- D) e9 G7 t- X  d原文链接:https://blog.csdn.net/weixin_42572826/article/details/106033709
    / T) e) w" B; U, e3 ]7 C/ O
    7 w* h& v; s/ q( L- r0 ~9 H2 ?7 ^
    7 I/ R" w3 j  O, [; ^6 d# z* m) C( y. x/ o2 S5 e9 y! O8 U9 o
    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-4-22 02:31 , Processed in 0.438704 second(s), 58 queries .

    回顶部