数学建模社区-数学中国

标题: python4次旋转图片后,多图叠加显示 [打印本页]

作者: 杨利霞    时间: 2020-5-10 16:27
标题: python4次旋转图片后,多图叠加显示

8 n$ v& U4 _# k* wpython4次旋转图片后,多图叠加显示
* t, Y6 s* l  t[color=rgba(0, 0, 0, 0.74902)]文章目录8 _; p. [# P5 b& A) E
- G" D+ L: {# Q$ U& y( ~
[color=rgba(0, 0, 0, 0.74902)]前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog
* k1 L4 B3 l) W想要的效果对比,原图VS显示 1.jpg 1.jpg
0 _) _. D) u& y: a. U9 I9 k2 G4 y+ w1 ~7 Y1 G% y
+ Q( W9 P$ y: x! W' u' C- H
问题2 e) Y! O* v# i8 \0 A: O
9 F9 r/ `- k* I$ [7 W- q, d
(1)在刚写出来时,在rotate_image()函数中没有加,im = im.convert(‘RGB’)这句话,就会出现有的图正常,但是有的图报错,无法保存,并显示下面这句话& W- P$ F5 |3 _  f! H, l3 g) M

4 p% Z2 c7 X! X  ~# X" }1 M9 h6 k% h- b这个问题可以在这一篇blog找到解决方法。就是im.read(url)后,再将图片转换为RGB格式(image.convert(‘RGB’))。这样就可以避免很多因图片导致的问题
- g! m. H2 W' l: \4 i5 [" f- |, J8 `( {  n
(2)在matlabplot中,显示图的第一步是创建画布,plt.figure(),然后在画布上添加子图,最后显示整个画布的图像时,并且让子图自适应来显示。而我遇到了这个就是关于self.figure.tight_layout()的警告,见下图。+ y! g. `7 t2 q
/ I* W5 W2 a( ^0 N
一般在使用plt创建一个画布后,程序本身会有一个自动调整子图尺寸来使用画布的情况,但是因为我是显示图片,所以这个自适应就出问题了。但是还好,只是警告,不是报错,为了方便,忽略就好…(但是我不推荐这种做法,希望有人研究一下,并把解决问题告诉我)
% x$ D( k3 O4 X) f& K为了方便,我直接在一开始加上下面这句,忽略掉。6 Z* @* l$ O  T1 }  A6 {" K
import warnings
' k9 ~% a5 S; D$ `warnings.filterwarnings("ignore")& o+ ]6 S% A- Z

1 X$ E) d4 v# n* ^* Y- ~6 x要点
$ o) ]: Q& L5 T! W9 @5 K8 N* c; I5 s* Z/ Y, [
1旋转图像现成的工具很多,一个是cv2提供的,主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图:) `# C& D6 b! I4 u% S2 i: F
' e9 V/ o4 |3 }& V) k1 \

8 y5 j3 y) S" y1 A: [ 3.png
9 {" n& }- j6 q. c
9 o7 a' \; \2 z6 M1 r3 I6 O* S5 V这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。
* X9 _! [. {3 T1 _
$ \( K. E" B& o, f这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图" \4 W- a8 Q+ T, S/ i6 g

% b9 F! g9 K2 W
6 n" O% y+ N) k: }6 w+ K; s 4.png
& @0 Q2 Y9 J/ G
8 B- D& W4 j+ ]5 p2 k代码#! /usr/bin/env python
7 M. I6 A* |% ?  j0 C* M" e# -*- coding: utf-8 -*-
* a6 ]; w# Q- z" A2 D0 Z1 H+ l# E# ! python3
# h0 x5 F0 R/ z: I) {7 m+ o/ O% Y% D" G. i/ e! C
import cv2" Y7 v. c; ^5 p. T5 Q( h. y3 F
import numpy as np" p1 \' ]6 P- O* n4 \0 U# \
from PIL import Image
3 F8 S0 t$ \( T2 o! ^) N; Hfrom matplotlib import pyplot as plt1 O1 [+ q6 l0 I" B' P0 {/ A
import matplotlib.image as mpimg, Q% |" m- T* ~

$ q( D" g& S1 r. H7 a; {* c4 @def rotate_image(url):8 M6 W4 q1 y% v' Z- L
        #旋转图像,并将其保存为4种角度的图片
% S8 Q2 l3 Q: s    im = Image.open(url,"r")
* |1 }$ o" X" v6 |    im = im.convert('RGB')  #避免有些图报错
0 m2 y; `( v% o) V2 B2 Q- O, ~    im.save('image_test/test_0.jpg')
) L7 l2 o+ d5 S9 X7 V8 y    im_90 = im.transpose(Image.ROTATE_90)
; }# V9 Y7 j2 g4 V' S    im_90.save('image_test/test_90.jpg')5 }2 y+ ~; r2 O9 t
    im_180 = im.transpose(Image.ROTATE_180)! C; h' o# c0 O
    im_180.save('image_test/test_180.jpg')
- p5 f, c( ~  f" i8 Q( B+ n    im_270 = im.transpose(Image.ROTATE_270)
8 u+ _# ?! x* x1 b$ K/ h2 ?    im_270.save('image_test/test_270.jpg')8 q' [4 O! S9 A
9 c8 w# W4 H6 S" S- v' L
def plt_merge_img():
# D  T; v, n$ f' Q: I        #将保存的四种角度的图片,叠加在同一张画布上- W* o. f6 z# }- Q' R" R+ u
        #使用plt.figure()创建画布,并用add_axes()来分割区域显示图片4 d! |/ |5 ~& w5 V/ H( r* a/ D
        #显示画布,并将其保存为fig_size.png2 t3 Q9 j% B) [2 M# [
    img1 = mpimg.imread('image_test/test_0.jpg')7 b5 s$ I  u: I3 O
    img2 = mpimg.imread('image_test/test_90.jpg')1 z) s5 }' j! ]
    img3 = mpimg.imread('image_test/test_180.jpg')8 D/ u* n0 c) i
    img4 = mpimg.imread('image_test/test_270.jpg')! @# c0 x. V, {2 b
    fig = plt.figure(figsize=(60,59),dpi=96)
! H+ _; U6 L% ~6 Q; s1 P
! f; r6 d3 g, }9 D+ u7 R3 d#上方的横图, i$ Q5 S/ F$ f0 ~; V$ Y
    ax1 = fig.add_axes([0.30,0.55,0.42,0.28])
$ V2 @# t+ e. j! d* }4 s. b- a- n6 r' t    ax1.imshow(img1)
& _( C% I) F4 w' l    ax1.axis('off')
& g4 L* b) j  F
2 P' W7 S% G! u* V# 右方的竖图
  B, e% V- k: h, w9 ]8 X    ax4 = fig.add_axes([0.67, 0.29, 0.28, 0.42])
; {  t4 h  G# u3 T: ?4 j; d  F    ax4.imshow(img4)
  i8 i  d3 k3 @& H4 H0 D4 `1 P    ax4.axis('off')
+ D6 E, h6 J/ k" [% U; }* l, K
! U$ j; W# [% V1 p/ s0 j# 下方的横图# p4 }* y5 f! O
    ax3 = fig.add_axes([0.30, 0.18, 0.42, 0.28])
9 b: O3 S, _# ~8 P; e    ax3.imshow(img3)
2 S3 C2 z) F  p7 B    ax3.axis('off')- J& F% z% f' B' O

7 p  H. u& N9 \/ `, k1 s& D+ U# W3 k#左方的竖图1 W0 K% r, N, F9 m3 H
    ax2 = fig.add_axes([0.07, 0.29, 0.28, 0.42]); [: Q" j. W" e! Q" Y) n! q
    ax2.imshow(img2)% t" N+ `  I9 O
    ax2.axis('off')4 r0 h2 y; Z1 ?4 N3 j1 t( [
    # 保存为sig_size.png" P: W) T  _- Q- W1 b# v
    plt.savefig("fig_size.png",dpi=96), f1 t* P" u2 A1 F8 e
    plt.show()
6 P1 a: l& V1 p5 _
0 q9 Z) |1 b" v6 idef main():, _6 I  G( ]3 r) z
    url = 'test_1.jpg'
# d) ?+ J6 |: b8 Q* @' T- l# I: v    rotate_image(url)& q% h5 g1 r+ K+ _8 c- X
    plt_merge_img()
9 E0 Z: G7 {# Z4 x( ]% a; z& `; f& S7 W; h( K" W( a7 |
if __name__ == '__main__':
0 l7 x) s1 y5 i5 D) T4 g/ D# M' V$ v    import warnings1 o8 _2 Z, Y- @# p
    warnings.filterwarnings("ignore")7 t$ v  l# J+ R0 {5 n! {( _! a, H* ]
    main()
; |7 \$ ]6 D! {5 D, \" I# s9 S& x# B% R# v2 N3 z8 I0 X
————————————————( h/ B$ ~; M8 }6 I3 k
版权声明:本文为CSDN博主「你要啥自行车」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
( m8 N% j: ?! k- p1 A原文链接:https://blog.csdn.net/weixin_42572826/article/details/106033709* q2 }, R+ e$ Q! W( S- F
7 D0 e( n$ @0 P; X6 I5 t  d
4 ~* ~- m* p6 d
  m! _- f% t1 [! C8 \+ n$ H

作者: chace    时间: 2020-5-11 12:57
感谢分享 , K3 {, c" U, o$ P





欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5