QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1581|回复: 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
    0 R' S( \- x+ j% F/ s: a
    python4次旋转图片后,多图叠加显示# L4 I: s% U3 ]# B0 `& Y
    [color=rgba(0, 0, 0, 0.74902)]文章目录
      : g) E9 a+ J+ g4 y% d+ X
      • 想要的效果对比,原图VS显示
      • 问题
      • 要点
      • 代码
        $ N9 O/ t* Z' x
    * T$ f9 [0 `! z( v
    * T# m& j) _' Z' O/ `
    [color=rgba(0, 0, 0, 0.74902)]前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog6 Y+ c6 y5 i7 |, U# S
    想要的效果对比,原图VS显示 1.jpg 1.jpg 9 M, s, O7 N% W5 L% O

    . L0 O1 U, |+ Z. W# N9 U, q) ]% ~: u8 j8 X7 x
    问题* q' ]; Q6 p  C2 J- W; T
    : Z. n& F( G* ]: r/ `) u' @! M$ s2 C1 s
    (1)在刚写出来时,在rotate_image()函数中没有加,im = im.convert(‘RGB’)这句话,就会出现有的图正常,但是有的图报错,无法保存,并显示下面这句话
    . _* m; A# ^( z
    - W# P: m/ \( o& T# N# u# r这个问题可以在这一篇blog找到解决方法。就是im.read(url)后,再将图片转换为RGB格式(image.convert(‘RGB’))。这样就可以避免很多因图片导致的问题" p+ a7 S8 k. L% {5 |
    : G  r6 K. [; b
    (2)在matlabplot中,显示图的第一步是创建画布,plt.figure(),然后在画布上添加子图,最后显示整个画布的图像时,并且让子图自适应来显示。而我遇到了这个就是关于self.figure.tight_layout()的警告,见下图。- C5 N, x! d  T8 v) u
    ! j+ R/ g; t8 n! U% Y) W% G9 N: n
    一般在使用plt创建一个画布后,程序本身会有一个自动调整子图尺寸来使用画布的情况,但是因为我是显示图片,所以这个自适应就出问题了。但是还好,只是警告,不是报错,为了方便,忽略就好…(但是我不推荐这种做法,希望有人研究一下,并把解决问题告诉我)
    * z+ N+ l5 P) o# Q) A6 P; C& }0 m/ s) t为了方便,我直接在一开始加上下面这句,忽略掉。
    ; d( i* M: W4 m$ P: w5 G, d; r# g2 aimport warnings) X4 _4 Q% b6 [! [9 G
    warnings.filterwarnings("ignore")
    8 Z" a: {& c6 A* J4 G# J( H9 L0 k+ R! z/ p0 k0 i- i2 B' N$ u
    要点
    * k! k3 N3 E/ r7 b. s% |9 G/ `2 Z% V. q2 N  Q! O" _$ t
    1旋转图像现成的工具很多,一个是cv2提供的,主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图:5 r! s/ m. \4 m9 b6 u

    : s! N4 R6 G. R3 p) R5 }' @( m  X% W% n; H! W/ m2 K/ H
    3.png
    ( X/ g) V/ I. Q, ?6 G
    0 L4 a3 K; x$ y$ p9 x$ F% l这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。& O1 ]1 S/ V5 K' r% T& W- r

    : j! k2 E3 [2 x5 m: f. l0 w这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图; q1 q* N4 }. t" D$ [3 |# v  f# w

    & e" {2 {9 l6 {" t# ]- `( y5 I8 H. Q- r' m
    4.png
    3 w- o$ z1 i, I$ l4 N3 H
    % |) R  ~. o- o% ?. u代码#! /usr/bin/env python
    , w# a5 x9 ?6 Q4 c! z# -*- coding: utf-8 -*-
    3 N6 q( _+ p2 F7 m# ! python3  b4 p- p" f" g0 j- ?: G
    ; q* k" n+ a+ [
    import cv2
    3 }& i, U1 f% _import numpy as np, P, O. [( {7 U& q+ F/ K# H2 @
    from PIL import Image
    " ?% Z# E" p. n' Y# Y$ J/ sfrom matplotlib import pyplot as plt
    5 @' s2 G# C0 Q/ A; gimport matplotlib.image as mpimg
    ' y% a+ H" K% F9 F5 @5 O# S+ [9 i$ g% ]+ W
    def rotate_image(url):- A$ o. G7 D: Y/ f* |! [) ~
            #旋转图像,并将其保存为4种角度的图片
    0 ?6 T0 t1 o% ]# I( f4 l$ O    im = Image.open(url,"r")
    # H8 P4 w# Y# z3 s3 Q- y    im = im.convert('RGB')  #避免有些图报错 . v3 X1 g4 y. X4 [% \6 R
        im.save('image_test/test_0.jpg')
    1 h4 d. l9 F6 [- E7 r3 W8 j    im_90 = im.transpose(Image.ROTATE_90)4 k' H. [' \$ ^: V/ t2 y/ W" O
        im_90.save('image_test/test_90.jpg')
    - e& D  ^# J5 A) V0 L9 x    im_180 = im.transpose(Image.ROTATE_180)
    6 s! h  m( ^7 V0 x* ~2 j' ?    im_180.save('image_test/test_180.jpg')# u+ J7 U6 t, y
        im_270 = im.transpose(Image.ROTATE_270)3 h, e! Q+ b8 C+ f+ q
        im_270.save('image_test/test_270.jpg')
    , X( }; r- N: O* [% p1 f9 N
    5 I# J; P/ I$ T, Y. E3 p1 v4 Rdef plt_merge_img():3 D, |- ?6 q; n" ^. s& o& f
            #将保存的四种角度的图片,叠加在同一张画布上# `4 V$ e! ~- d! \! a" y
            #使用plt.figure()创建画布,并用add_axes()来分割区域显示图片
    5 {( u4 V+ X/ J4 H$ T) k- i        #显示画布,并将其保存为fig_size.png
    1 ]0 }8 G+ \3 Q    img1 = mpimg.imread('image_test/test_0.jpg')
    9 G" t; E6 n2 r: d; e- X    img2 = mpimg.imread('image_test/test_90.jpg'). h# }; N" |3 }! A- V
        img3 = mpimg.imread('image_test/test_180.jpg'), z. S' N& f( @+ j
        img4 = mpimg.imread('image_test/test_270.jpg')
    / r* ^; ~& ]' }' a& U    fig = plt.figure(figsize=(60,59),dpi=96)
    4 M. K1 \" f$ ~# i: Y
    - E% F  p! _6 x' ?1 m#上方的横图' i! y0 w4 a; z. s4 Q: U% j0 ]4 Y
        ax1 = fig.add_axes([0.30,0.55,0.42,0.28])
    ; O( U) O+ w3 E) e2 S: ^  I    ax1.imshow(img1)
    * H( G* D8 m! O+ `3 z( }' E& L+ G    ax1.axis('off')0 i& O: f9 c4 f% |' E

    + \' Q8 q" X& ]" v# 右方的竖图
      M" Z$ w6 F2 B  J    ax4 = fig.add_axes([0.67, 0.29, 0.28, 0.42])
    ! y6 C; n! C% R- `7 M- p    ax4.imshow(img4)
    ) R& G$ G  c5 `# T: B    ax4.axis('off')1 ], S) |1 c, R7 Q, |: t

    # f# i7 ~4 |8 L- @8 P  M# 下方的横图- g* W1 R& P, N; j) y8 j3 j
        ax3 = fig.add_axes([0.30, 0.18, 0.42, 0.28])$ e3 w: l# x3 l: c0 c* l
        ax3.imshow(img3)
    2 |+ i: Z5 e$ a# ?& e& g    ax3.axis('off')
    , n! B9 v) n5 r4 c/ D
    * ?$ V& O' _2 z8 a#左方的竖图
    ) m, |& u9 @8 m, _1 C; u7 b3 l    ax2 = fig.add_axes([0.07, 0.29, 0.28, 0.42])
    5 _0 v  Z3 [+ ]; I7 g6 [: x    ax2.imshow(img2)3 S$ d2 k: n. @  {: x+ ~
        ax2.axis('off')3 G3 q/ B6 D: U, t
        # 保存为sig_size.png
    9 I2 @9 S6 K* `+ Q    plt.savefig("fig_size.png",dpi=96)  M! @! ?: O0 k
        plt.show()1 c  O$ b: d: z" D9 W

    / [. W6 f& V& Sdef main():
    ! G, u4 n" F. `; ?& u    url = 'test_1.jpg'
    " U/ K0 ^* ?8 o" k  m6 z    rotate_image(url)
    ! s9 ^( U4 m0 V" O3 W6 O! q0 v9 W# N    plt_merge_img()
    ( {8 Z% X' y5 j2 W. P) j6 @) r* C( h/ C) d! u: A9 D
    if __name__ == '__main__':
    + m( h7 D6 a& Y7 Q1 a5 k( e9 B    import warnings9 \' {( `0 s3 l" k' H  ?" j( ]
        warnings.filterwarnings("ignore")# N* b% b, o/ O. e& k; Q
        main()& q9 O" m/ r2 D! {' N
    + L- o3 W2 Q' a, C
    ————————————————% P1 t2 r9 V& d' }
    版权声明:本文为CSDN博主「你要啥自行车」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。- D  D$ h! e2 p; B# w# q1 b0 k2 F
    原文链接:https://blog.csdn.net/weixin_42572826/article/details/106033709* ]! n* E3 S7 t1 }4 @, @
    ! Z/ ~3 c& K+ a9 y0 H
    ; K+ c, r2 K8 @7 ~/ p# G" K

    ; P3 A$ n0 g" U/ n1 U' J( B  D
    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 01:30 , Processed in 0.488870 second(s), 59 queries .

    回顶部