QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1670|回复: 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

    # Q" A, p7 \9 ?  O* H0 bpython4次旋转图片后,多图叠加显示+ r: ~: t/ n& c+ |
    [color=rgba(0, 0, 0, 0.74902)]文章目录
        U  Y& L5 f/ E0 G* j7 k& `5 [4 i
      • 想要的效果对比,原图VS显示
      • 问题
      • 要点
      • 代码
        ; A# ]) w1 ^' J5 s( Z: m/ e
    3 E% g) W% [, l( u
    / A4 P' A- Y5 n( t. ^- F& Y- ?
    [color=rgba(0, 0, 0, 0.74902)]前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog7 X5 ~" c/ t! e9 R
    想要的效果对比,原图VS显示 1.jpg 1.jpg / }, z1 }% X& ~- ]5 E, u
      p3 v; g* F" p3 ]5 ^- `
    9 `/ z0 k) e2 \/ n' M/ T0 E
    问题; b4 i; V) t, M- h( w4 U, x; S& M

    ! j, m4 M0 E; ^( k1 p  w& P(1)在刚写出来时,在rotate_image()函数中没有加,im = im.convert(‘RGB’)这句话,就会出现有的图正常,但是有的图报错,无法保存,并显示下面这句话4 a( c+ d& `2 Q9 k! h. C

    5 {+ R6 q% X7 y% f( h这个问题可以在这一篇blog找到解决方法。就是im.read(url)后,再将图片转换为RGB格式(image.convert(‘RGB’))。这样就可以避免很多因图片导致的问题
    3 u( R4 T& N" _* u2 g. F5 d8 t2 R, L
    (2)在matlabplot中,显示图的第一步是创建画布,plt.figure(),然后在画布上添加子图,最后显示整个画布的图像时,并且让子图自适应来显示。而我遇到了这个就是关于self.figure.tight_layout()的警告,见下图。1 s  m1 n5 D& J) B0 Y: H- a3 R
    2 m8 ?, c5 F3 I, @
    一般在使用plt创建一个画布后,程序本身会有一个自动调整子图尺寸来使用画布的情况,但是因为我是显示图片,所以这个自适应就出问题了。但是还好,只是警告,不是报错,为了方便,忽略就好…(但是我不推荐这种做法,希望有人研究一下,并把解决问题告诉我), {6 @; a1 |" S; j. h* I0 U7 j5 ~
    为了方便,我直接在一开始加上下面这句,忽略掉。: q* j& o" a7 l$ R
    import warnings; p# K: H# m, Z' h4 _
    warnings.filterwarnings("ignore")
    % t+ ]5 r, m) p* m2 z2 F) T9 }9 g, w& t) O- Z" C
    要点
    . l# ^$ k% M( h. Y* F/ H& }
    5 Z/ b5 ?4 A+ H' q  J5 p- K8 e# T1旋转图像现成的工具很多,一个是cv2提供的,主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图:# B8 @9 S! ~, V
    % c; ]4 I* J3 K. W
    * d, b% ~+ q& h; t& D
    3.png 4 H2 u* n: z. c6 V' ]
    ( \1 p0 s1 \; ]! r' w5 c& s
    这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。
    # U7 N" N! }) {4 f% \6 q0 m
    + [9 j8 C3 ]3 E" H* y# E0 n这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图
    % D& y9 Q! n, X, i9 H0 p' Z3 a
    0 v# }1 M. X/ `  S# h1 b  X% e) `1 ~! h! b
    4.png
    8 T4 z  n- S' }$ m
    * R9 r! [+ x  G% W代码#! /usr/bin/env python
    * O3 L' t9 J: Z# ^# -*- coding: utf-8 -*-
    / A; u# ?* |, p: ^6 b# ! python3
    ; i$ A0 r0 L7 g! e3 Y8 }
    % ]7 j, u& h- A8 a6 ]import cv2
    , s# \! W0 _& x# Timport numpy as np
    & H9 U8 ?% Y& Q: @from PIL import Image  K- i8 E$ ^# v& Z: W
    from matplotlib import pyplot as plt6 ?# U: k3 Q& \6 y' h
    import matplotlib.image as mpimg
    ; {, h2 u6 t8 B8 B' Q) Y- G2 W# B) b! X& Z5 \) w
    def rotate_image(url):/ k5 r  C/ ~* K  ]8 H$ U  s  a
            #旋转图像,并将其保存为4种角度的图片
    0 X7 j9 {& Y6 W+ U    im = Image.open(url,"r")5 e2 I. b# q4 v6 d) y9 P+ `
        im = im.convert('RGB')  #避免有些图报错 $ [: m- f/ s5 S7 f& y+ C
        im.save('image_test/test_0.jpg')
    ( R& }/ B& w" A2 [( b: K$ d    im_90 = im.transpose(Image.ROTATE_90)
    ) g7 R  q8 Y* e6 `! R    im_90.save('image_test/test_90.jpg'); n- y6 H$ u1 [+ `8 C0 Y
        im_180 = im.transpose(Image.ROTATE_180)4 O& K- L3 j  I) B# K# x; z2 v
        im_180.save('image_test/test_180.jpg')8 U; U1 S  ^* Z4 b; _  _
        im_270 = im.transpose(Image.ROTATE_270)) X4 N( x5 i' D+ o! f9 A/ e" G
        im_270.save('image_test/test_270.jpg')
    9 S1 M! E( e) z! n
      N1 A' l1 H0 d$ W! t. adef plt_merge_img():
    & n; K+ m# p1 l* o0 n5 l. Q  D        #将保存的四种角度的图片,叠加在同一张画布上& Y* [) H: z% @4 n
            #使用plt.figure()创建画布,并用add_axes()来分割区域显示图片- p) [/ v1 t6 n- f/ e
            #显示画布,并将其保存为fig_size.png$ S* _! e3 U& i$ M. E. g. O
        img1 = mpimg.imread('image_test/test_0.jpg'): h9 J4 p1 f- _  X- _
        img2 = mpimg.imread('image_test/test_90.jpg')
    ' L, ^: I) Q- F3 v- c    img3 = mpimg.imread('image_test/test_180.jpg')  O9 i/ o) T% ]
        img4 = mpimg.imread('image_test/test_270.jpg')/ |  u. `8 g* U4 ^' C0 T
        fig = plt.figure(figsize=(60,59),dpi=96)
    8 T# |6 W! k, N9 b5 c
      e5 {( m4 z: H5 f* B2 U& Z' I#上方的横图- ]+ H! Q6 q- Q9 A9 p* A
        ax1 = fig.add_axes([0.30,0.55,0.42,0.28]), D) _) c5 `4 b
        ax1.imshow(img1)  j0 l$ F! x4 B5 D7 X! f
        ax1.axis('off'): Z1 c" k: Q! r
    ! a/ e7 f, Q4 U: K
    # 右方的竖图
    5 T& Z0 S/ f1 i1 @, c    ax4 = fig.add_axes([0.67, 0.29, 0.28, 0.42])8 Z" d) s3 r4 C1 G, {4 C( z
        ax4.imshow(img4)
    % H7 D/ h5 Q1 @. p    ax4.axis('off')& }4 g$ s: }  g6 Q4 h8 @

    : j2 ]; @9 r, X$ {/ i# 下方的横图7 ?' F4 Z  b& v' m# e' M* H
        ax3 = fig.add_axes([0.30, 0.18, 0.42, 0.28])6 P- j7 {' C! G/ A. z& B
        ax3.imshow(img3)
    . \( e: O4 Y8 b$ @$ N1 o    ax3.axis('off')4 e' h+ k; C3 h0 u: q' i) I
    / X& I2 b; N% U) N
    #左方的竖图
    4 X( U/ J: F" V    ax2 = fig.add_axes([0.07, 0.29, 0.28, 0.42])" _. u& W) V) r0 |3 @3 l, D
        ax2.imshow(img2)# N8 H2 v9 K1 Q) _
        ax2.axis('off')# ^) Q" N- S  {# `. E! a
        # 保存为sig_size.png# _% @8 |- F& Y+ k  F' W
        plt.savefig("fig_size.png",dpi=96). X+ P/ `  o0 V( X3 B
        plt.show()- h; F8 [  ~" L5 T* f  s2 i
    * ?( J3 {8 _/ x; j7 _3 y
    def main():7 ^7 x6 A# M( ]5 U5 p
        url = 'test_1.jpg'/ z& t8 p! t8 X
        rotate_image(url)# E0 O6 B0 k4 r8 e' X
        plt_merge_img()
    - J% P8 E/ {: B0 j$ H: ]6 s$ a% Z7 P/ t7 y; {/ S: n  _. ]
    if __name__ == '__main__':, r! h5 K, C8 |$ S: z. j$ j! I8 k
        import warnings# }8 ]- v4 U- P  c# Y
        warnings.filterwarnings("ignore")* ?' s/ i) v: M: k
        main()
    0 T: f( [4 Y6 R4 d  S: p
    . w( k0 N: o% Q4 S  _+ F————————————————
    ' F& J3 h8 J! ?4 P& ^. i/ K  X' O版权声明:本文为CSDN博主「你要啥自行车」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    4 N! {: ^0 ^; C& o原文链接:https://blog.csdn.net/weixin_42572826/article/details/1060337093 S4 e( P% {& C3 |& s- ]
    0 Q% {: z& B" |
    ) k+ g6 P( b3 v0 t8 P) ~' `" W) B

    " s5 `9 s2 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-9-8 14:46 , Processed in 0.305514 second(s), 59 queries .

    回顶部