数学建模社区-数学中国

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

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

, |2 _& Q: s- q4 [) P1 C& f* m' `) |python4次旋转图片后,多图叠加显示& q1 M6 M( r$ c  l
[color=rgba(0, 0, 0, 0.74902)]文章目录
: q) h7 ^5 @. e+ }# N( t- E, r3 }6 o7 b) O4 t4 x7 E
[color=rgba(0, 0, 0, 0.74902)]前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog9 [' ]  D! p. W
想要的效果对比,原图VS显示 1.jpg 1.jpg
8 T, s; K# B$ A# `- ?) P
& {3 n- ]( F8 x# T6 d# X2 \0 p
1 k' f5 E; l/ h问题" I" ], I, Q# A+ U
) M8 R( F+ w3 P% h3 G. D" g% o) F6 N
(1)在刚写出来时,在rotate_image()函数中没有加,im = im.convert(‘RGB’)这句话,就会出现有的图正常,但是有的图报错,无法保存,并显示下面这句话
3 `5 t$ q5 G8 ~; M% P0 Z3 {) Z
" J" M) `' D, N这个问题可以在这一篇blog找到解决方法。就是im.read(url)后,再将图片转换为RGB格式(image.convert(‘RGB’))。这样就可以避免很多因图片导致的问题, M2 o1 X' A/ i; M* [

) m7 I7 I. X& l0 C/ ~+ ^1 j(2)在matlabplot中,显示图的第一步是创建画布,plt.figure(),然后在画布上添加子图,最后显示整个画布的图像时,并且让子图自适应来显示。而我遇到了这个就是关于self.figure.tight_layout()的警告,见下图。
- D0 s! v) R6 n0 @6 O* V8 @# a  X, `( k5 E
一般在使用plt创建一个画布后,程序本身会有一个自动调整子图尺寸来使用画布的情况,但是因为我是显示图片,所以这个自适应就出问题了。但是还好,只是警告,不是报错,为了方便,忽略就好…(但是我不推荐这种做法,希望有人研究一下,并把解决问题告诉我)7 i" _! X7 ~1 g1 Q9 d  r
为了方便,我直接在一开始加上下面这句,忽略掉。$ v- J) w! _1 l, l' j8 M- v* u0 o  q
import warnings1 P' f( U; w  P( S) d3 R3 ?5 C2 d
warnings.filterwarnings("ignore")
# N* N2 b" k  W  d' d8 m8 z% j% n
4 ?+ c( r* y2 `1 r3 `! i& K/ V要点1 t% G/ S7 G. r
7 m8 H1 @4 {9 Q& G+ Y
1旋转图像现成的工具很多,一个是cv2提供的,主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图:) K, s2 l! }6 j: a+ K  y1 b$ x$ ~: H1 ^
" H3 \0 L9 ^& e0 ^+ c
% R; a8 v8 `6 u
3.png 6 k) s" q0 O$ g

  B) c* d- R6 N! N/ P7 _/ G这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。
5 Z$ V' J3 o1 l9 f. [/ H0 k- B9 ?! r$ N7 x* M- t* |& F
这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图
, N$ ~% C- M* Z; J. R
7 s' B' p9 S1 J; s: R9 n: V6 Z: B8 g( N) [+ t' M7 e
4.png
6 I# K5 U' y' ?7 ?
0 G6 W) z) V! Q* b" D) D& k代码#! /usr/bin/env python5 e7 w* M. K# V" o4 c; x
# -*- coding: utf-8 -*-* F9 Z* E$ D' a! m& P2 D
# ! python3
  ?4 B% g4 V; J4 r; w5 A2 s
+ }; k  W% s9 V! E5 Uimport cv20 R  C0 \2 k5 p. v# Q
import numpy as np+ W2 S, i9 w; b; z; G: C
from PIL import Image5 v4 v1 J: F5 J! |  |+ x
from matplotlib import pyplot as plt7 a9 p! _1 u, W: C: I
import matplotlib.image as mpimg
# W& V' {0 U% `( Q. |5 ^* z% y; f; E8 N8 j" n
def rotate_image(url):
, s  M7 G7 z9 }        #旋转图像,并将其保存为4种角度的图片6 i. J% ]( V) x5 h
    im = Image.open(url,"r")2 k; j# e) i$ n1 E
    im = im.convert('RGB')  #避免有些图报错
5 |4 \  k% L4 w+ T% o& N& D    im.save('image_test/test_0.jpg')
7 P5 q. \4 m" k# E5 P$ ^    im_90 = im.transpose(Image.ROTATE_90)# w  \3 f' W9 P" p% I7 c9 |
    im_90.save('image_test/test_90.jpg')
4 `, G0 @3 P% g: B: Z, S6 G    im_180 = im.transpose(Image.ROTATE_180)& C4 H2 _" S7 P% [' M+ [
    im_180.save('image_test/test_180.jpg')2 q7 H" Q1 t; v% h7 V
    im_270 = im.transpose(Image.ROTATE_270)
7 w% X" p1 m* J( z* d    im_270.save('image_test/test_270.jpg')# Z- d' f, s- k  N6 F. i$ H
6 W+ ]8 B4 `6 F3 ^) Y
def plt_merge_img():5 h4 ]$ _4 a8 z/ D, ^
        #将保存的四种角度的图片,叠加在同一张画布上0 J. c  j+ n( T+ b' `
        #使用plt.figure()创建画布,并用add_axes()来分割区域显示图片2 }7 b" y4 W7 }, X4 d
        #显示画布,并将其保存为fig_size.png0 A& J( H2 _4 Q# w) @4 ?
    img1 = mpimg.imread('image_test/test_0.jpg')
4 I$ p7 ~& }6 i    img2 = mpimg.imread('image_test/test_90.jpg')1 A4 I- N  ]& J
    img3 = mpimg.imread('image_test/test_180.jpg')
& }5 s; ~5 P6 @  k, ~& ]+ E0 @    img4 = mpimg.imread('image_test/test_270.jpg')- \! j4 ^& \' A, t2 H9 e
    fig = plt.figure(figsize=(60,59),dpi=96)! q- C5 U* @! l! q
# q5 |' O- X: y9 h1 l3 p2 ^7 f
#上方的横图
1 e2 z9 w2 I4 h. k5 }    ax1 = fig.add_axes([0.30,0.55,0.42,0.28]); R1 E+ V% l- c9 t8 j# J
    ax1.imshow(img1)8 p5 H. A4 C# X! S( w
    ax1.axis('off')
$ t4 ]# F1 x3 g- d
7 @% Z7 X' ^  P# Q/ b# 右方的竖图
: b( `8 S, k! W' N; p0 W5 i$ X    ax4 = fig.add_axes([0.67, 0.29, 0.28, 0.42])
  o9 O( T& w8 x! w- Q7 f& g" c  |* M- Q    ax4.imshow(img4)
2 l4 J8 E$ M* p( j    ax4.axis('off')
# k6 m+ Z9 e& F2 f8 u+ `4 w' U/ W4 L' i5 ~' ?5 p+ r( u3 Z  d
# 下方的横图6 n( F4 s' ]9 p9 \
    ax3 = fig.add_axes([0.30, 0.18, 0.42, 0.28])
  D+ F3 v  e* j: s    ax3.imshow(img3)0 j, q" X' u& V- w) x  b
    ax3.axis('off')
* O9 `8 R! J5 n2 d, Y2 M! @! E: P% [2 @3 V( ?- @8 h) N# U0 E4 K
#左方的竖图
5 [8 ^& O9 n0 v) t  f: s    ax2 = fig.add_axes([0.07, 0.29, 0.28, 0.42])
; b  {# k, y+ w( s) H    ax2.imshow(img2)/ P* P: @/ O( S0 H/ P
    ax2.axis('off')
* \. \; E  v1 @7 k  T$ S    # 保存为sig_size.png$ v# _& r! j# y! E, w1 h
    plt.savefig("fig_size.png",dpi=96)
  C9 U, a/ K& C$ z    plt.show()
4 J  g8 w8 u+ }$ l' @; H8 Z- T; s; o, G9 u
def main():
' c# ]6 H0 P' [5 M+ O2 W    url = 'test_1.jpg'
! C; @0 f& S* ~0 t* v    rotate_image(url)* C$ G* {+ T6 g
    plt_merge_img()% H7 @2 }3 I1 \) _
" W( t- V/ k  X* B. @* l; e
if __name__ == '__main__':  [- @  d4 g! Q$ {: T; Z$ L' l
    import warnings
! C2 Y! W( {2 z  t2 M  u    warnings.filterwarnings("ignore")
# J- }! @4 x2 X% v    main()
6 X3 |, L3 B/ z0 x; y! a4 _6 L0 ~
. C6 \5 n: ~  n# @, n————————————————
, A' V# V! E+ @5 K, i版权声明:本文为CSDN博主「你要啥自行车」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。" q1 A" G8 ]; p$ l  f3 T" L$ s
原文链接:https://blog.csdn.net/weixin_42572826/article/details/1060337092 w8 t" R$ a0 e
; G9 z8 @7 k/ J

+ {- G+ s) f4 Y8 @+ P- A. ?
# b$ C0 C3 @6 ?! N7 H) B
作者: chace    时间: 2020-5-11 12:57
感谢分享 4 _* r/ Y  N- s: Z; t





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