QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1673|回复: 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
    & p( _) Q& j+ ?8 }4 R9 ~" ]" W
    python4次旋转图片后,多图叠加显示# _/ _6 J4 V2 j8 R& Z( N5 c
    [color=rgba(0, 0, 0, 0.74902)]文章目录

      ) ?" ^! h% d: A% ]% y
      • 想要的效果对比,原图VS显示
      • 问题
      • 要点
      • 代码& E- a. J. I! h$ K. }# V

    / k4 N# E* N* q" d  r. Y6 c4 H2 z4 ^# W1 ]' h2 l; M
    [color=rgba(0, 0, 0, 0.74902)]前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog, _8 O0 E# n& E% r3 s
    想要的效果对比,原图VS显示 1.jpg 1.jpg
    8 [9 J( _% w, j" ]" @. x% X
    - g& E4 c! |. \9 P
    4 C' w* ^" r# S8 a+ p' J4 d问题
    " j, c! a2 Y: G# Y0 N/ W% `, S( O" ^* _, B
    (1)在刚写出来时,在rotate_image()函数中没有加,im = im.convert(‘RGB’)这句话,就会出现有的图正常,但是有的图报错,无法保存,并显示下面这句话
    1 @4 v4 j3 T# I4 n
    ( y3 O6 s9 B2 s0 C) S- l0 o; L这个问题可以在这一篇blog找到解决方法。就是im.read(url)后,再将图片转换为RGB格式(image.convert(‘RGB’))。这样就可以避免很多因图片导致的问题
    . [% P* C8 p. U: e3 w* X0 \) V8 }, b6 ]( ]6 Q9 y
    (2)在matlabplot中,显示图的第一步是创建画布,plt.figure(),然后在画布上添加子图,最后显示整个画布的图像时,并且让子图自适应来显示。而我遇到了这个就是关于self.figure.tight_layout()的警告,见下图。
    & ~0 ?: q! U! V* |4 C) d/ B( c5 \
    $ W; V9 ]: {) c& p; ~一般在使用plt创建一个画布后,程序本身会有一个自动调整子图尺寸来使用画布的情况,但是因为我是显示图片,所以这个自适应就出问题了。但是还好,只是警告,不是报错,为了方便,忽略就好…(但是我不推荐这种做法,希望有人研究一下,并把解决问题告诉我)
    / m! f# Z/ {9 M: T8 u9 ~为了方便,我直接在一开始加上下面这句,忽略掉。# n2 x; \( p9 b- W$ {
    import warnings
    6 j* |! \: T: V+ V0 p# i, ?8 swarnings.filterwarnings("ignore")1 ?3 t+ E: T! m1 v0 I$ P$ K
    % \' t* E5 Z0 w% {; K. ~
    要点1 K. K' T8 M  w$ b
    - e; X' M& B0 W& C* n
    1旋转图像现成的工具很多,一个是cv2提供的,主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图:
      W9 D3 {+ }, e4 i" v, t- d1 f6 ~/ I  p; e$ ?' Q
    " o$ S* ~7 O3 q& D
    3.png 0 u) `3 [# o& s
    6 L$ n  e4 X2 y: i  X! G2 u0 l
    这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。
    - d3 n5 H- G. ^& v1 M. _- R% x  L
    这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图
    + `7 j; H9 k; c8 ~, b6 o$ d& C% ^! X# t7 R

    ' w$ n8 u! `  u 4.png ) P& t& ~/ l1 }2 Q: |" b
    ' ]1 T/ L' O# @/ @% t3 j: W
    代码#! /usr/bin/env python
    3 ]2 U9 ]! J0 p! \4 T$ f. g+ I# -*- coding: utf-8 -*-2 X1 z6 u7 l( V3 x9 b' `8 b% L
    # ! python3) X6 {# |4 H- D' D7 P  Q  t
    # f9 e0 b& o  W; B
    import cv2
    - P7 D. z( i+ [4 y+ Q6 e' uimport numpy as np
    - K" {! r) c( T6 y2 ofrom PIL import Image
    / i: X+ I+ |. n" |* U6 J' Rfrom matplotlib import pyplot as plt- M6 B+ G  A+ m) D! `6 b) G
    import matplotlib.image as mpimg
      q2 b- w5 k, N; z
    ( E7 W9 s5 h3 R& _# x8 p2 \def rotate_image(url):
    ! F( G0 o. d9 P% w$ c        #旋转图像,并将其保存为4种角度的图片
    / n* x7 B4 c1 J6 {& V/ }6 L; j7 B- R    im = Image.open(url,"r")6 S+ `6 g7 I1 C  y
        im = im.convert('RGB')  #避免有些图报错
    8 D% h, F. c- n" Y2 J    im.save('image_test/test_0.jpg')" J$ {. D: _# M' o- R1 z/ b5 \( Y
        im_90 = im.transpose(Image.ROTATE_90)' X8 S4 Y% X( [( f" a0 V. f
        im_90.save('image_test/test_90.jpg')+ e6 c3 y& }" [. C
        im_180 = im.transpose(Image.ROTATE_180)$ m! G9 D. ~! Z7 B
        im_180.save('image_test/test_180.jpg')
      S2 q' s8 i5 u/ Z  M    im_270 = im.transpose(Image.ROTATE_270)
    3 {% B6 e% J- d" O3 j7 u    im_270.save('image_test/test_270.jpg')
    ; x; |* y- h3 Z3 x$ R' @) |% V, R
    6 j; M+ M1 `  C. M- Rdef plt_merge_img():
    ! ]6 n7 y  y6 y1 ]8 ?0 A! b        #将保存的四种角度的图片,叠加在同一张画布上  f: ~- L6 h. C1 h) Y
            #使用plt.figure()创建画布,并用add_axes()来分割区域显示图片
    & z9 \' [" r5 c        #显示画布,并将其保存为fig_size.png
    4 @2 J, _/ i2 G% U6 c1 @    img1 = mpimg.imread('image_test/test_0.jpg')/ Y# S+ e5 Z0 t2 h( q: d  Z
        img2 = mpimg.imread('image_test/test_90.jpg')7 Q1 T) T4 v' ?( E
        img3 = mpimg.imread('image_test/test_180.jpg')% Y# R& {- Q0 ]4 G
        img4 = mpimg.imread('image_test/test_270.jpg')
    7 p3 q' T. i& Z' K8 p9 @    fig = plt.figure(figsize=(60,59),dpi=96)
    ! \. p& @9 F3 g/ a$ R, c
    ( O3 g" t6 k( N8 L& L#上方的横图
    5 k/ o7 u( A  |% W- C  _+ Z' D    ax1 = fig.add_axes([0.30,0.55,0.42,0.28])& n5 Q4 A. ]# Y0 z# `
        ax1.imshow(img1)  C6 Q4 G' Q, W9 K. u' t9 h
        ax1.axis('off')
    ; x4 c1 F% H9 F3 Z( R" n3 Z" }; g
    # 右方的竖图
    8 W* r, N, N3 K5 H9 Z& V  u    ax4 = fig.add_axes([0.67, 0.29, 0.28, 0.42])
    3 |0 `* s0 r" q$ |3 C) I0 `; G    ax4.imshow(img4)
    " v$ N* |, C  @, `3 g# \4 ~' ^$ R1 O    ax4.axis('off')
    " v/ ?# Y1 J  a0 U# B4 R( G2 s
    / O4 W* J# i) t* Q# 下方的横图
    $ l7 m( C) P! N9 L2 {6 }/ ]    ax3 = fig.add_axes([0.30, 0.18, 0.42, 0.28])0 D1 ^2 D* a, T( l8 W# v
        ax3.imshow(img3)
    - ~9 Z& T' j8 u. c) S    ax3.axis('off')
    . y/ W, B3 e+ {5 r" i: V6 j8 Q3 O& c! O
    #左方的竖图: }& d  |/ H2 Z, E; c8 ?
        ax2 = fig.add_axes([0.07, 0.29, 0.28, 0.42])
    7 ?# Q- T! l8 O4 R1 O! O    ax2.imshow(img2)8 c0 w1 F' I+ o: L8 m1 C# c% x3 o
        ax2.axis('off')! y3 {- N' B+ W* x! {$ N
        # 保存为sig_size.png+ q! ^, \: }" Q% I
        plt.savefig("fig_size.png",dpi=96)
    # F3 w) j, }' k    plt.show()( {1 z* N9 B* U0 c3 v/ P+ t

    ) O% r/ ~9 D" V- m, U& V) xdef main():
    ; P; b7 |( X6 f# q3 T9 Q$ k    url = 'test_1.jpg'
    9 N: q# v4 B8 A7 R    rotate_image(url)1 N# O* Q6 z$ t& W6 Q
        plt_merge_img()
    * @# w7 w0 Y" G( [
    % O7 D0 ?* h% c' X8 \: ^$ |  Mif __name__ == '__main__':" g3 e/ Q# n: ]( ^" E- h# t
        import warnings
    / V$ e9 }1 g1 t/ a  @    warnings.filterwarnings("ignore")
    * R$ {0 p; }/ j) t- w1 T- x    main()
    3 Z' q  O# V9 E& `! d; G+ f- }0 k% K# _( f( ^. B
    ————————————————% _# F& `( S9 R  G" J0 x2 L
    版权声明:本文为CSDN博主「你要啥自行车」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。3 [  `, m0 ]/ L
    原文链接:https://blog.csdn.net/weixin_42572826/article/details/1060337098 W2 T9 W8 {5 Y
    ! F6 U% y. @7 w5 g  J

    & {4 f" E9 `0 c
    9 T3 ?* V3 E  L# w
    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 20:45 , Processed in 0.445146 second(s), 59 queries .

    回顶部