QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1671|回复: 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
    % S; Q9 c9 b) d6 w, ?5 ]! s
    python4次旋转图片后,多图叠加显示$ F( i8 z, e, j! c, s0 m
    [color=rgba(0, 0, 0, 0.74902)]文章目录
      4 m, I7 D$ L! \, m" H7 t: j9 u
      • 想要的效果对比,原图VS显示
      • 问题
      • 要点
      • 代码* d0 B7 ~% D- n2 m- g

    ' S2 F9 n: k2 N% m% V
    ; c% i3 T# V' a8 R/ }8 p[color=rgba(0, 0, 0, 0.74902)]前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog
    : \8 d  c& ^9 ^! B, h4 u+ O+ E想要的效果对比,原图VS显示 1.jpg 1.jpg
    2 w) l/ l, Z0 Q" Z+ v5 n/ M# f# r# A) j+ d! }7 L* e: b' ]  o$ k

    ) r/ y& h) B! U+ l  p: r0 m问题" ~8 l8 n9 G5 D/ y% G6 k/ v1 E
    6 H3 X" A. b) a6 R" g
    (1)在刚写出来时,在rotate_image()函数中没有加,im = im.convert(‘RGB’)这句话,就会出现有的图正常,但是有的图报错,无法保存,并显示下面这句话) h% u7 R  `. q* _0 G' B3 E* v6 \
    + x& @+ A! Q/ g& z4 E& }, Q3 K
    这个问题可以在这一篇blog找到解决方法。就是im.read(url)后,再将图片转换为RGB格式(image.convert(‘RGB’))。这样就可以避免很多因图片导致的问题
      l# k7 s  O' a: t  F9 a# ]: o% V7 D8 k* f4 W; H
    (2)在matlabplot中,显示图的第一步是创建画布,plt.figure(),然后在画布上添加子图,最后显示整个画布的图像时,并且让子图自适应来显示。而我遇到了这个就是关于self.figure.tight_layout()的警告,见下图。
    9 T+ K. T" ]* v& T# b* G% y- L7 D! M! ?$ `: k
    一般在使用plt创建一个画布后,程序本身会有一个自动调整子图尺寸来使用画布的情况,但是因为我是显示图片,所以这个自适应就出问题了。但是还好,只是警告,不是报错,为了方便,忽略就好…(但是我不推荐这种做法,希望有人研究一下,并把解决问题告诉我)2 w" ?  R1 v: m3 f1 }+ |+ G7 y
    为了方便,我直接在一开始加上下面这句,忽略掉。
    7 s! \( ?6 T# w& e$ s9 }9 Iimport warnings( X0 M0 q1 d- Z& O8 G" g
    warnings.filterwarnings("ignore")
    3 V4 B( L8 ?4 }
    , ?' I' z1 y/ F, O5 d# z) [0 O- D要点2 L; F9 Z* B3 u& S

      ?1 z/ B8 m. m4 d1旋转图像现成的工具很多,一个是cv2提供的,主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图:
    9 H$ S+ W, x' A2 m+ D- P! B
    % G5 Q$ }& j  {$ [* d" ^* w) }  M/ q2 _. Y" [. j0 d
    3.png
    ' C7 G& `. U; [+ ]) c
    4 L$ M- L1 R1 I' N这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。
    7 \1 x$ e, Y, e9 x2 W% Q6 \; B; U2 u! n7 v
    这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图; J8 V: l, M3 ]$ Q3 N
    - _( C4 X+ @' [1 b

    / k# \- D& d( \1 |3 d8 Y 4.png
    : O1 t/ O  S' e2 k! @( W+ @# o2 q$ t, ~+ c
    代码#! /usr/bin/env python
    8 i, d( ~" p  y# -*- coding: utf-8 -*-* P: n" Z! Y, D( {
    # ! python32 Y- s, x2 N7 o2 L, c) G5 P
    8 h2 i9 h& S% Q1 C
    import cv2+ W! R$ @) x5 _( Y" u& Z
    import numpy as np
    " i' p$ M* `1 Kfrom PIL import Image
    ) @. @+ ]3 h3 z& Qfrom matplotlib import pyplot as plt: j6 X7 A* w( ]& n& Z
    import matplotlib.image as mpimg* L( q$ Y/ T$ K% j! W& I! b

    3 P( J  Z# }% u. Fdef rotate_image(url):
    ) ?$ f" o8 G8 d8 q) V        #旋转图像,并将其保存为4种角度的图片# I3 ]4 P3 w; n+ }& |" q
        im = Image.open(url,"r")/ e' H' a  d6 Y+ J0 t
        im = im.convert('RGB')  #避免有些图报错
    : i* S+ s! K" |2 t) p    im.save('image_test/test_0.jpg')1 ^* Z- |! }  @
        im_90 = im.transpose(Image.ROTATE_90)$ y; k$ O. M, Y2 m$ ^; A9 X
        im_90.save('image_test/test_90.jpg')& e( M$ v3 }, [, `3 _# h) U
        im_180 = im.transpose(Image.ROTATE_180)
    - y! {8 D; X. M8 `1 O    im_180.save('image_test/test_180.jpg')$ E' f& J6 X% N; j8 U  ^5 h
        im_270 = im.transpose(Image.ROTATE_270)
    0 f8 I, j7 A6 q% {$ Z3 W9 Z1 W    im_270.save('image_test/test_270.jpg'), K$ v* n& r2 }6 K& V/ P4 i1 X
    3 X* R, a, L* i; Z5 _& Q1 s, B
    def plt_merge_img():
    # j# Z- ]4 ~7 w: P: M+ d# {1 a        #将保存的四种角度的图片,叠加在同一张画布上
    ! W  ^" V% l/ v! ?& o        #使用plt.figure()创建画布,并用add_axes()来分割区域显示图片
    7 ?' N+ t1 T( Y. j        #显示画布,并将其保存为fig_size.png
    9 G8 q; c, a& L    img1 = mpimg.imread('image_test/test_0.jpg')/ l/ H- r8 w! l$ m% x
        img2 = mpimg.imread('image_test/test_90.jpg')' u- S6 }3 P, a
        img3 = mpimg.imread('image_test/test_180.jpg')2 @7 D/ E% [. A$ h
        img4 = mpimg.imread('image_test/test_270.jpg')
    6 C- ]& c. U* Y1 n" [, Y' K& d    fig = plt.figure(figsize=(60,59),dpi=96), b8 U# m" n) z, C& w) O( [2 H

    ) @, y. k  z) a" T' u#上方的横图) C8 P- L' w4 I1 |+ Z" q# D
        ax1 = fig.add_axes([0.30,0.55,0.42,0.28])
    * ^- M0 u5 T5 o  E  @: s* N    ax1.imshow(img1); U* ]3 Y# N+ @- {/ Q4 t& m
        ax1.axis('off')+ S6 m9 _+ V3 a
    : s% q4 A. U1 C4 f& }
    # 右方的竖图
    ! K% [2 B4 ^1 x+ a# ]    ax4 = fig.add_axes([0.67, 0.29, 0.28, 0.42])6 L9 f) B3 D( }0 ]# ]1 a9 M: @1 x% \
        ax4.imshow(img4)
    + x4 y7 z8 H: ?1 g! d6 q8 D9 D    ax4.axis('off')  v* h; G' b$ M3 r, H3 U# t
    - X' E* X9 q* n
    # 下方的横图9 x: f% |$ w+ e2 b' E6 a+ y# t
        ax3 = fig.add_axes([0.30, 0.18, 0.42, 0.28])7 i2 b& J5 [* z* n' J! l
        ax3.imshow(img3)+ m7 D/ ^4 @5 D, L# i# k1 J
        ax3.axis('off')# D( w  p" P5 k/ s( U. O1 I

    0 d8 r  d* ]5 X. `8 p  Q#左方的竖图
    9 e: V! B( s. m* x7 G' o2 m* \    ax2 = fig.add_axes([0.07, 0.29, 0.28, 0.42])5 B7 b' E, K1 c
        ax2.imshow(img2)
    ! y; [5 m2 U( {0 x    ax2.axis('off')
    . V7 Y# Y+ O' [! e    # 保存为sig_size.png1 E& l# U" R3 H( [+ ^$ Q  F
        plt.savefig("fig_size.png",dpi=96)8 m; e7 z  |$ D1 Q2 |+ f) Z
        plt.show()" [5 X& N- }( k, L* l2 U7 a' x

    " l" @- ^% h  {3 P( i4 I0 w& q4 Gdef main():8 |& f1 W: ]% s2 j
        url = 'test_1.jpg'9 c$ p% ]! t" E* [% E: S
        rotate_image(url)
    ' k/ Z$ I' ]4 l5 _9 ^  m: }    plt_merge_img()4 y0 D6 H  c$ {9 |2 S$ r( E

    . h( H( `% l7 l9 o0 h4 y; uif __name__ == '__main__':
    ; F1 ]) I3 z% _4 {    import warnings* {: q: x5 A$ f# w& _
        warnings.filterwarnings("ignore")) m$ `8 C0 I3 H; z2 e7 I6 \
        main()
    9 u/ f' P) Y/ e+ T% s5 U1 q7 O, n
    ————————————————* {5 v% m3 Z. t9 |; q9 Z' B
    版权声明:本文为CSDN博主「你要啥自行车」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。/ q' H. k: z# I, ^( }
    原文链接:https://blog.csdn.net/weixin_42572826/article/details/106033709
    ( H1 D3 J: C2 L5 N. _! v
    1 n+ S6 }$ C% t8 L4 Y2 E9 `. L$ H/ _) q+ ^: i3 l) y# S

    & ~3 ^+ w6 E. `$ i3 p
    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-9-8 15:27 , Processed in 1.865103 second(s), 58 queries .

    回顶部