QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1672|回复: 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
    & C$ Y1 _+ V4 n% e
    python4次旋转图片后,多图叠加显示
    " W3 O% V$ i5 b& F; C[color=rgba(0, 0, 0, 0.74902)]文章目录

      % S% U* h) h5 U# n3 u' D4 [
      • 想要的效果对比,原图VS显示
      • 问题
      • 要点
      • 代码
        . ~* b5 r- v) E$ Y9 ~1 C

    $ b3 e2 x) b. f. O! A  T' g; v
    4 m2 ]' {" ?. L, D- n[color=rgba(0, 0, 0, 0.74902)]前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog
    . g& n2 K, b7 C' k' U: _想要的效果对比,原图VS显示 1.jpg 1.jpg - x) M! D$ j+ b8 n9 w4 _6 `
    ) a- L. O% n: X% s- D+ \) _& T

    ' {* X4 M& ?6 f3 @2 O问题" f, ]' |1 v$ F7 b1 K
    - e5 n& ]) h8 R- w) R, p1 k
    (1)在刚写出来时,在rotate_image()函数中没有加,im = im.convert(‘RGB’)这句话,就会出现有的图正常,但是有的图报错,无法保存,并显示下面这句话
    8 M0 E4 J9 u7 B# V3 I; T
    2 D& W$ F! L+ V' |1 c  F) ^这个问题可以在这一篇blog找到解决方法。就是im.read(url)后,再将图片转换为RGB格式(image.convert(‘RGB’))。这样就可以避免很多因图片导致的问题
    ( ?) o* ?9 U  J% O: I4 a8 D! L+ C3 Q8 ^5 m8 a8 @. J7 e2 t. @
    (2)在matlabplot中,显示图的第一步是创建画布,plt.figure(),然后在画布上添加子图,最后显示整个画布的图像时,并且让子图自适应来显示。而我遇到了这个就是关于self.figure.tight_layout()的警告,见下图。; H4 l1 [/ D& Z( H* S5 ]7 r
    - _4 l  R# ?0 A* L
    一般在使用plt创建一个画布后,程序本身会有一个自动调整子图尺寸来使用画布的情况,但是因为我是显示图片,所以这个自适应就出问题了。但是还好,只是警告,不是报错,为了方便,忽略就好…(但是我不推荐这种做法,希望有人研究一下,并把解决问题告诉我)1 c4 G) z( j, h  u. A- J
    为了方便,我直接在一开始加上下面这句,忽略掉。
    / `+ P2 J1 N2 A  Y; q5 timport warnings: K- h3 C' W: u1 i
    warnings.filterwarnings("ignore")5 [4 f, E' @  ^$ v  O: Q
    " ?" W, n4 A" B
    要点
    ' |2 l2 `5 k0 Z/ ^  H. ^  W) O2 p1 Y0 c, |
    1旋转图像现成的工具很多,一个是cv2提供的,主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图:7 V9 C, X$ Q3 I" d8 H0 v3 Y
    0 D, V6 d, e" _2 E, ~
    ' |' c5 u8 \: e4 m& {
    3.png 3 ?& G  Y& s0 ]' K
    3 P- x! L6 P# o2 q
    这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。
    : r9 C: r0 d  `$ s9 q; D5 E& |8 ~1 B* w7 z9 O; a' w; K: ]8 m
    这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图
    6 o( K8 c8 p' D1 x
    + V( ?7 V7 {9 S1 [% x8 K( Y& d4 z0 q  S8 \/ t
    4.png
    # ?2 G& @9 u5 j2 ]
    + V5 i1 k, h* B代码#! /usr/bin/env python
    6 b9 L+ K1 o  Q- z5 H9 P# -*- coding: utf-8 -*-  t6 J, c% a. \' V% D2 u
    # ! python3
    1 z# ?! k+ y6 r6 c: I; p  S# A4 r5 u3 Y7 \: R" O7 m' x' L( V
    import cv2
    3 c( l" q  h8 W* h6 limport numpy as np! J6 s, m( e# z) d! U+ ~% y
    from PIL import Image
    & z2 I$ b% T2 N0 sfrom matplotlib import pyplot as plt2 ]5 D( p) g+ @" _# q
    import matplotlib.image as mpimg  C/ ~0 m$ K: o2 Z

    8 [# Z# p# y8 V1 w- {; xdef rotate_image(url):2 l# C" X- g( U5 n* I  f* d
            #旋转图像,并将其保存为4种角度的图片
    / M, s: T, O: v, A    im = Image.open(url,"r")
    ) x( V# t7 G) S+ K" S* m    im = im.convert('RGB')  #避免有些图报错
    . u# m! G! c3 a  U    im.save('image_test/test_0.jpg')
    ) K, _# T3 A& S  r) D    im_90 = im.transpose(Image.ROTATE_90)7 Q) d1 Q% ]9 x2 [8 b  Z7 x7 {
        im_90.save('image_test/test_90.jpg')( C& y* T5 E0 C3 b8 B4 F& F" D
        im_180 = im.transpose(Image.ROTATE_180)& W$ E1 f6 {3 x9 w6 x
        im_180.save('image_test/test_180.jpg')7 ~' x& t0 `: e1 D" z- T1 L  {
        im_270 = im.transpose(Image.ROTATE_270)
    1 t( `' e, I! x0 R, I9 X    im_270.save('image_test/test_270.jpg')
    ) x& O' s7 F6 h5 s7 e0 r. I. F2 Z: v4 N9 M
    def plt_merge_img():
    . ], M3 w$ d9 C        #将保存的四种角度的图片,叠加在同一张画布上
    8 L! M* r( G, Q" M2 ^0 H0 v        #使用plt.figure()创建画布,并用add_axes()来分割区域显示图片
    6 r4 ~2 ]- M3 H        #显示画布,并将其保存为fig_size.png
    9 w1 ]" s% l, h; Y+ K; J' q+ G( x    img1 = mpimg.imread('image_test/test_0.jpg')
    7 ~9 s5 p, a+ g1 |; p/ ?    img2 = mpimg.imread('image_test/test_90.jpg')
    ! T) B/ |8 d) I7 z; A    img3 = mpimg.imread('image_test/test_180.jpg')( s6 Z  S7 _" @, e/ |, ]& {7 C
        img4 = mpimg.imread('image_test/test_270.jpg'); `- |# `$ G+ v
        fig = plt.figure(figsize=(60,59),dpi=96)
    - g1 ?! P- ~$ o* l4 r! R' t, L/ _- r! W, y% |. k4 A
    #上方的横图& Q" `4 j7 t/ Z  k0 i9 J! g
        ax1 = fig.add_axes([0.30,0.55,0.42,0.28])" S# U; c7 U# g* Q2 t
        ax1.imshow(img1): M. s7 U7 J. G: J
        ax1.axis('off')
    2 Q7 j$ H% d2 Y& Q4 D9 y
    2 n( q0 k  s4 b# 右方的竖图
    & d" p2 t6 T1 r! O* i# b. U    ax4 = fig.add_axes([0.67, 0.29, 0.28, 0.42]); k" X. y0 U) ?2 P" w
        ax4.imshow(img4)
    ) s' `1 r4 H. B, b    ax4.axis('off')! x, I3 i8 r- o' u- d

    $ a0 c! m! `  B4 P( H# 下方的横图
    + Y% e0 Q  W+ t3 l7 ]( Y; D    ax3 = fig.add_axes([0.30, 0.18, 0.42, 0.28])
    9 Y9 [, Z7 W, g0 H    ax3.imshow(img3)
    / M, z$ L: o! I! v* X) D# `6 @    ax3.axis('off'). S* D1 K/ C7 B
    / K4 x. ~. z& o$ Z3 s
    #左方的竖图1 [* B& v$ W: a" ]8 `4 U- h9 W
        ax2 = fig.add_axes([0.07, 0.29, 0.28, 0.42])7 w3 M  A$ v! g* l0 U& D- h
        ax2.imshow(img2). W/ ~0 b  n6 o: R7 T: f, x
        ax2.axis('off')0 w+ Y  x) @$ D$ N4 ^4 g
        # 保存为sig_size.png
    ! P9 U- d( a( d: Z    plt.savefig("fig_size.png",dpi=96)& }5 q# [, j% Z7 a6 Q" D  \
        plt.show()7 y9 f# A' j  s9 s$ J/ F

    - z: i. `' V3 H; l- [7 Z  ~9 idef main():
    " r! ]; w2 c: z: ~    url = 'test_1.jpg'% N7 h7 X" J' }5 |! h# `( p$ V
        rotate_image(url)
    ! b; n. N8 A/ H7 y; i" v    plt_merge_img()
    4 G. ]/ Y( Q/ n" B+ h
    4 d0 }- e: y- c. r/ X/ `if __name__ == '__main__':
    5 l; ^2 }3 N. }8 ^$ m* e    import warnings0 c# c" v( c( c# s
        warnings.filterwarnings("ignore")' k7 ^/ ~. [& Q  m9 r, v
        main()
    ( O* S8 O: d* S9 u5 }) G$ F& W
    7 s+ l  P7 ^- J' F/ m8 \————————————————
    2 y# N# x$ b' P版权声明:本文为CSDN博主「你要啥自行车」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    . ^$ g" E( ]  T. C  U- y+ H原文链接:https://blog.csdn.net/weixin_42572826/article/details/106033709) z! _1 ?3 F/ Z

    + p; L- X" a/ H. E" @
    2 C, x( T# ~, h2 Z7 |
    ! R6 ^9 Y3 @& X$ H) o& @# f
    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 17:10 , Processed in 0.554232 second(s), 58 queries .

    回顶部