QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1645|回复: 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
    6 v$ n3 u3 x1 o8 r$ `5 T( _
    python4次旋转图片后,多图叠加显示
    * O4 [+ K* x: \7 O/ Y/ n[color=rgba(0, 0, 0, 0.74902)]文章目录
      / l! f( g! F" x6 C! i+ ?: L
      • 想要的效果对比,原图VS显示
      • 问题
      • 要点
      • 代码3 t5 k" j! E0 S
    3 C( {( j6 M+ P' G5 D3 O
    4 e9 w; ]. L  l! K# F9 t& k
    [color=rgba(0, 0, 0, 0.74902)]前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog
    5 k% S0 q5 `& f/ B想要的效果对比,原图VS显示 1.jpg 1.jpg
    3 b7 Y5 L+ {  O/ \' z
    ) q% |  Z$ a0 ~0 v# }; g
    : I( Q4 |4 A( q  n问题/ V. z% N& {  T5 |( }

    4 d, k# J; j: g1 x5 @" @! W(1)在刚写出来时,在rotate_image()函数中没有加,im = im.convert(‘RGB’)这句话,就会出现有的图正常,但是有的图报错,无法保存,并显示下面这句话6 ^0 y7 T1 b" C7 K4 v' a& \, e

    ' {6 a7 N0 h5 `* N# y这个问题可以在这一篇blog找到解决方法。就是im.read(url)后,再将图片转换为RGB格式(image.convert(‘RGB’))。这样就可以避免很多因图片导致的问题* d- c: h: W4 v' \' |) a
    ( x) V2 b( a" T1 |
    (2)在matlabplot中,显示图的第一步是创建画布,plt.figure(),然后在画布上添加子图,最后显示整个画布的图像时,并且让子图自适应来显示。而我遇到了这个就是关于self.figure.tight_layout()的警告,见下图。
    # s; |+ c; f. Y: u; C0 O5 [8 f5 x4 E, t' h$ a( U
    一般在使用plt创建一个画布后,程序本身会有一个自动调整子图尺寸来使用画布的情况,但是因为我是显示图片,所以这个自适应就出问题了。但是还好,只是警告,不是报错,为了方便,忽略就好…(但是我不推荐这种做法,希望有人研究一下,并把解决问题告诉我)
    5 A6 H; D+ H8 M. R7 M  e为了方便,我直接在一开始加上下面这句,忽略掉。
    ' \6 N5 c* C* Wimport warnings
    , B, V. F$ `1 ?) lwarnings.filterwarnings("ignore")% ?' N( u* s# G0 Q5 N7 y, z
    " X1 {* g: G; A# J1 L( ]
    要点
    4 t" D* ]9 t, A8 g. }$ }  j3 i4 n. x8 N
    1旋转图像现成的工具很多,一个是cv2提供的,主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图:! M5 l! `2 P% Y3 L' P
    3 l) C% ~( D5 ?& m/ |; {: u6 U
    + G* [; X( b, t% m- ]6 l
    3.png
    & o) u, ^9 l0 M' c
    - }3 Q8 k* w  `' G这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。
    / B! u7 U" n7 _$ M5 V
    # g8 ?( s5 Q! z+ d. p这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图
      |8 h+ @; I- O0 I! c! ~! \
    ' v) J; [$ k8 Z7 l5 D0 `" p: q4 u/ p( d- M" W! L) H% a: D
    4.png . f9 L/ {& Y$ s+ b
    $ a$ F* d3 }* p$ H# i8 W* O9 {
    代码#! /usr/bin/env python, ~7 a! k( N( b' Q2 g
    # -*- coding: utf-8 -*-$ `# P) j3 j( O  g
    # ! python3& G0 q6 X7 J$ w  T. e' @

    & ~& o0 D- @# ?1 q( yimport cv2
    . h# U- ^  T7 T4 q4 bimport numpy as np
    0 a4 {/ o2 G) L" k3 d" w# ^from PIL import Image
    , T3 i, u0 ~3 i; E% R3 u) I% ofrom matplotlib import pyplot as plt5 M4 j  L  I# V$ U% R
    import matplotlib.image as mpimg$ D: O4 d( c6 t, C+ U+ |( Y
    2 {6 j7 K3 O3 Z1 z+ J
    def rotate_image(url):
    1 O9 |* _7 c8 g2 _5 v* z        #旋转图像,并将其保存为4种角度的图片& X% n% k6 z5 H' t
        im = Image.open(url,"r")
    1 |9 P: L) }+ ]2 {+ q    im = im.convert('RGB')  #避免有些图报错 , ^8 f; T: J' {! F0 b
        im.save('image_test/test_0.jpg')$ q6 G$ j' X1 ^3 G& E* ~
        im_90 = im.transpose(Image.ROTATE_90)
    . i; `; D% y) b: k% P/ R7 x8 ?    im_90.save('image_test/test_90.jpg')
    7 v# Y# \. {3 O- l# @7 ^1 ~& ^    im_180 = im.transpose(Image.ROTATE_180)- [5 ^$ b+ @7 [6 q1 @
        im_180.save('image_test/test_180.jpg')
    8 M9 @, ^, x: h& s* `    im_270 = im.transpose(Image.ROTATE_270)- F! q3 [6 |6 M! Q6 L
        im_270.save('image_test/test_270.jpg')9 A* I5 V1 X8 n. s! a( T
    # v9 ~, R! J2 {$ ]8 n" N+ \4 l- J1 ~
    def plt_merge_img():
    9 L7 C7 s: ]. `. t) N; \        #将保存的四种角度的图片,叠加在同一张画布上
    2 j  C2 B! g+ \! F8 Z$ ^. j7 Z) g        #使用plt.figure()创建画布,并用add_axes()来分割区域显示图片$ s! j. U$ \4 o( G. T
            #显示画布,并将其保存为fig_size.png, t3 f/ D2 d2 Q5 w% T1 w
        img1 = mpimg.imread('image_test/test_0.jpg')
    / Y7 Z7 G# p$ s# U! o& z0 n    img2 = mpimg.imread('image_test/test_90.jpg'): z6 w5 v# M3 I3 t3 M$ _
        img3 = mpimg.imread('image_test/test_180.jpg')1 P2 q5 d6 y+ A, a
        img4 = mpimg.imread('image_test/test_270.jpg')0 m2 x6 s/ y2 a! o  b
        fig = plt.figure(figsize=(60,59),dpi=96)
    ' E( ?) n+ N2 X2 Q% H! i
    4 j/ j7 E& G+ t& o7 [5 O#上方的横图- V2 X* P4 Q5 a3 z8 o
        ax1 = fig.add_axes([0.30,0.55,0.42,0.28]); J; R6 {, E4 a/ @
        ax1.imshow(img1)6 G2 d& ]8 u5 x
        ax1.axis('off')6 _; Z7 G* u5 y) u

    7 W( j$ f9 t$ p1 F5 S3 `# 右方的竖图  m' y. U) x2 W! F6 r! m% o
        ax4 = fig.add_axes([0.67, 0.29, 0.28, 0.42])
    9 p# C6 n; y5 K- Z    ax4.imshow(img4)
    ' E2 x& Y8 P# ?% y    ax4.axis('off'); a/ Q! g# o9 S0 h9 U

    . R' N8 n+ l3 q, ?  P# 下方的横图2 Y' a4 M4 f% c
        ax3 = fig.add_axes([0.30, 0.18, 0.42, 0.28])
    2 V. }! s+ |4 l- O8 m    ax3.imshow(img3)6 j: V. g) u+ |% q5 r. b
        ax3.axis('off'); g& w7 L- M3 p! b! k

    8 J  L/ b4 ^) c0 L* e#左方的竖图
    7 }4 L: V  F# C    ax2 = fig.add_axes([0.07, 0.29, 0.28, 0.42])# x% M5 }1 i7 I6 \* {3 [' B
        ax2.imshow(img2)8 @7 z3 \3 Y3 F1 P& G$ H
        ax2.axis('off')
    ; P; [) K" f7 Q# C, V  F    # 保存为sig_size.png! a7 m( \2 I( m, d, k6 g
        plt.savefig("fig_size.png",dpi=96)+ s" J5 ~: I& B+ h7 H% i. G8 q
        plt.show()
    ) }; b" H! R: j! T; I1 ?% H9 P. W: v) G! `$ Y
    def main():1 F( Z) i8 f7 u+ t) O$ J( x
        url = 'test_1.jpg'
    + p- z5 S1 O. U3 ]& k    rotate_image(url); Q+ a- f' ?: l( r
        plt_merge_img()+ z! P& i7 E' j7 ]; M

    4 J* K& U: r" hif __name__ == '__main__':
    : f7 t$ ]9 S0 S& B    import warnings
    5 B/ f+ Y2 n+ s% b7 b    warnings.filterwarnings("ignore")
    ! m0 b& M2 ~$ z/ Q2 y# k    main()
    2 o1 U( o3 Y7 j7 O  d
    9 ?7 u7 y5 ^* x) x, M% L' h" q& x————————————————9 @" n6 l: X! D( T! Q. M* G
    版权声明:本文为CSDN博主「你要啥自行车」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。8 }- B8 u: r" B" P5 ?3 H
    原文链接:https://blog.csdn.net/weixin_42572826/article/details/106033709* k+ C: q1 j6 E" r) x8 u$ Z
    5 f  T: j" J9 L

    ( O( t! y% s* y: r& v  {, ]! Z2 b6 @1 F4 [6 e; z- i
    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-7-25 05:45 , Processed in 0.448236 second(s), 58 queries .

    回顶部