QQ登录

只需要一步,快速开始

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

    4 S4 V6 u. t8 V1 \$ v( bpython4次旋转图片后,多图叠加显示
    ( i& K) K" c+ E* i8 e[color=rgba(0, 0, 0, 0.74902)]文章目录

      + _; P* N/ p! [( _: d7 N
      • 想要的效果对比,原图VS显示
      • 问题
      • 要点
      • 代码
        6 Q) ~5 k; F7 d- Q

    % h8 d) ]+ R3 q& w7 @+ b, V
    ; M( d+ S9 ^, k6 W! _[color=rgba(0, 0, 0, 0.74902)]前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog
    + a- r( B9 p9 h; J想要的效果对比,原图VS显示 1.jpg 1.jpg & {; C. |2 ~" B8 b

    ) h; o4 L2 T" R- w$ C, C
    & N( C; ~5 t0 Q问题
    * n0 u9 d! v9 O9 A! \4 G* W) J+ B2 W  {( p: n4 U' @3 E
    (1)在刚写出来时,在rotate_image()函数中没有加,im = im.convert(‘RGB’)这句话,就会出现有的图正常,但是有的图报错,无法保存,并显示下面这句话1 E$ D1 @+ t2 ?/ A. I

      g. _0 `; e1 Y, C% L这个问题可以在这一篇blog找到解决方法。就是im.read(url)后,再将图片转换为RGB格式(image.convert(‘RGB’))。这样就可以避免很多因图片导致的问题
    " R6 r$ v1 v6 N9 X
    4 S; }# B7 ^4 H" h7 d6 B9 B! r4 F(2)在matlabplot中,显示图的第一步是创建画布,plt.figure(),然后在画布上添加子图,最后显示整个画布的图像时,并且让子图自适应来显示。而我遇到了这个就是关于self.figure.tight_layout()的警告,见下图。
    5 ]; B' F2 K+ u( J
    : R$ C  n8 C( g! y' d( O4 k一般在使用plt创建一个画布后,程序本身会有一个自动调整子图尺寸来使用画布的情况,但是因为我是显示图片,所以这个自适应就出问题了。但是还好,只是警告,不是报错,为了方便,忽略就好…(但是我不推荐这种做法,希望有人研究一下,并把解决问题告诉我)& t/ f+ \2 }( `2 l( u8 ~4 e$ q( S
    为了方便,我直接在一开始加上下面这句,忽略掉。
    & O5 f7 |8 i2 R; }import warnings, p5 Q- \% J) J7 K4 u) |
    warnings.filterwarnings("ignore")! D( `% I: r# x; F# |3 x

    2 e+ \: j2 C6 l5 h( {5 g要点& f( E  I5 `* I& B

    6 a, i& @2 R1 M2 z' V1旋转图像现成的工具很多,一个是cv2提供的,主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图:  z0 X, t$ `; m
    7 \, p7 Q& \( ?/ L

      @: G. m* @4 |) }8 _ 3.png 1 s! G7 B" t. e* `% }$ e

    * \- h  I+ O) a) S7 m这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。/ b4 m3 F5 Y7 z: o; T

    5 L( G4 d( c9 P/ f5 n这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图' F  }' M: J4 x. _! O; |' y" [6 L
    " T6 q; m, H% m" Z/ A6 r0 n

    , x4 f. y0 k& r0 R  {8 i3 r 4.png
    0 q6 O& ^! ?: K" l3 V) b+ f
    # i, F; l  p. Y+ K/ f2 u代码#! /usr/bin/env python
    " s/ t6 `1 ^& h/ V$ R$ W3 F! t0 ?) b# -*- coding: utf-8 -*-7 d- _3 |  B" t& d0 c
    # ! python3
    : M6 S1 \. W& b: I0 P( R7 P+ N0 y4 [
    import cv2
    ( `7 g' w4 f3 i9 f# Timport numpy as np
    ' ~' ^' W4 w' B3 C5 J8 v7 ufrom PIL import Image
    2 A, i4 G4 v9 C+ \$ Q7 j( [from matplotlib import pyplot as plt
    $ n* {, V0 E3 d, simport matplotlib.image as mpimg- p4 t& C, I0 y( `- }) `% T7 T
    ) Q3 ~. Y  ?  G, j
    def rotate_image(url):
    % d1 \/ p8 d+ x+ l; E0 e7 u, y        #旋转图像,并将其保存为4种角度的图片
    ( I. c/ y; y1 `5 M" Q    im = Image.open(url,"r")4 k/ |# t+ D  e& B* a' K8 Y
        im = im.convert('RGB')  #避免有些图报错 $ o. Y, [, _1 J) T7 _6 r  l* t; v, a
        im.save('image_test/test_0.jpg')
      g3 t" C$ v, U, z5 @$ }4 e' J    im_90 = im.transpose(Image.ROTATE_90)
    - M# f' x- k8 v# l: p    im_90.save('image_test/test_90.jpg'), Y( Y' |! M$ n# w! e
        im_180 = im.transpose(Image.ROTATE_180)5 {1 P7 H1 n: ^6 {5 x1 J
        im_180.save('image_test/test_180.jpg')
    4 ^* X5 w* T: e    im_270 = im.transpose(Image.ROTATE_270)
    ) L% L- _1 I2 O0 J! ?7 [' H    im_270.save('image_test/test_270.jpg')" W$ e8 _7 z: I) C
    . t  m$ X' C! G: p6 u5 a+ M
    def plt_merge_img():
      _5 r" K( d! @7 A        #将保存的四种角度的图片,叠加在同一张画布上
    7 d9 l' \  _1 `/ x        #使用plt.figure()创建画布,并用add_axes()来分割区域显示图片
    3 R: B; x( d5 G" w6 ?, o        #显示画布,并将其保存为fig_size.png
    ' ?" ?  q, y# x: W. `" Z7 e    img1 = mpimg.imread('image_test/test_0.jpg')/ [& b# m& a& ~2 R, Y" R0 e
        img2 = mpimg.imread('image_test/test_90.jpg')! V% @5 D& ^# i6 y3 n  `& S, I* R
        img3 = mpimg.imread('image_test/test_180.jpg')1 H" k, g8 ?  x! Z' ?3 V  @
        img4 = mpimg.imread('image_test/test_270.jpg')
    7 s& W% R+ F4 {# C" l    fig = plt.figure(figsize=(60,59),dpi=96): _6 q) z2 `8 {) ]+ w

    7 q2 @' D8 `8 h, p1 ~, t; o#上方的横图2 O# U4 i. z6 y# ^1 @2 z2 w! i
        ax1 = fig.add_axes([0.30,0.55,0.42,0.28])" N  q* D: W# N( p9 B0 [" [( z
        ax1.imshow(img1)
    8 [1 D# l) }: j% y: ^    ax1.axis('off')+ ~( Y* j5 z: i

    ) K9 m% l9 B. d" R" `4 h# 右方的竖图
    ; Y" `# C) z, T    ax4 = fig.add_axes([0.67, 0.29, 0.28, 0.42])
    3 L! V' A% x3 o& ?    ax4.imshow(img4)
    3 _& w9 X8 |: @; n, F    ax4.axis('off')4 U5 m" n/ v8 l% v# C, E
    , m0 `2 B$ H# I5 E* `9 Y
    # 下方的横图
    8 Y* X' u2 g9 u- @! S" d! g) r, [    ax3 = fig.add_axes([0.30, 0.18, 0.42, 0.28])% }3 M! _9 t  h! g  Z0 f0 O( t: K# `
        ax3.imshow(img3)
    ( B) W. U) g6 u" p    ax3.axis('off')% ^7 ]& o* f  X6 _: f6 E6 H

    6 T2 D' n' K& [  T, S$ t#左方的竖图
    : t3 |9 M/ x: W3 L# v$ M    ax2 = fig.add_axes([0.07, 0.29, 0.28, 0.42])! v5 p3 ^4 b, a% g. ]9 O/ q( ]$ p, @
        ax2.imshow(img2)
    : ]' g/ q* Y/ X) ]1 u    ax2.axis('off')
    & c: \; W- P" U( B  I7 M! F" h    # 保存为sig_size.png, P7 E- A& Q1 A) F
        plt.savefig("fig_size.png",dpi=96)
    * e  }/ x6 c5 b' r    plt.show()
    , O1 M3 ]9 k, _' d
    . b  a7 a  w6 Z1 {, O; K, f! A/ tdef main():
    & u' ]3 ^- r  Y: N9 ?. D5 X6 o    url = 'test_1.jpg'
    ) e4 Y6 x, c$ g1 k    rotate_image(url)* ?% E" J8 {% f9 Y  p( O
        plt_merge_img()
    . k$ U$ s! |6 y. E
    4 K8 ~- e. A. ]4 q" ]  eif __name__ == '__main__':
    , A! D: c2 M% O( K/ Z    import warnings
    0 ]4 ~1 ?2 G1 W8 N. N9 W    warnings.filterwarnings("ignore")1 X; n# F* o, Q% R9 i+ [
        main()2 z, b/ j& }  g4 `
    6 R2 A2 v' c' D# V
    ————————————————) q8 f1 K4 k4 W
    版权声明:本文为CSDN博主「你要啥自行车」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。; M0 r! }+ A! V  @+ _3 `. j
    原文链接:https://blog.csdn.net/weixin_42572826/article/details/106033709) g+ p5 |' e) m2 g7 P# L, H
    0 S9 H7 O% \7 z; G7 \6 B( p6 n* c! ^

    # f. A) w* t( z& a0 }: C* _- g4 E8 s: ]6 p2 @- C
    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 07:32 , Processed in 1.548730 second(s), 59 queries .

    回顶部