数学建模社区-数学中国

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

作者: 杨利霞    时间: 2020-5-10 16:27
标题: python4次旋转图片后,多图叠加显示
# O; p( b% w* j, d7 ?) d
python4次旋转图片后,多图叠加显示5 ]2 O$ ^/ k! o* ^) [# ?2 l0 f
[color=rgba(0, 0, 0, 0.74902)]文章目录; f. H+ j8 Y" g& u9 t/ s+ ~6 Q* k

) A' \1 K" v1 N' T2 ^2 i5 z[color=rgba(0, 0, 0, 0.74902)]前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog
7 A, s6 V  V6 ~7 ~; k想要的效果对比,原图VS显示 1.jpg 1.jpg : i4 {+ y7 N" R9 }% T' e
3 s$ _" |, d8 J* u5 g
- ^2 h7 M. R. i0 o% R  U
问题. n. N0 @4 f8 a2 O8 s5 z7 p2 I
& N7 X- h+ w, x$ d( `" w+ ^! `
(1)在刚写出来时,在rotate_image()函数中没有加,im = im.convert(‘RGB’)这句话,就会出现有的图正常,但是有的图报错,无法保存,并显示下面这句话) g( |* ^9 u, |- R- Z

# _& ~5 E$ Q' v$ `/ o这个问题可以在这一篇blog找到解决方法。就是im.read(url)后,再将图片转换为RGB格式(image.convert(‘RGB’))。这样就可以避免很多因图片导致的问题! ]7 g! q; G: }  V- G: g

$ i. u2 p4 [1 o/ M6 K+ |(2)在matlabplot中,显示图的第一步是创建画布,plt.figure(),然后在画布上添加子图,最后显示整个画布的图像时,并且让子图自适应来显示。而我遇到了这个就是关于self.figure.tight_layout()的警告,见下图。
3 g  I/ `7 ]# R8 Q  p  q
; p) l. t6 |" d3 W" U一般在使用plt创建一个画布后,程序本身会有一个自动调整子图尺寸来使用画布的情况,但是因为我是显示图片,所以这个自适应就出问题了。但是还好,只是警告,不是报错,为了方便,忽略就好…(但是我不推荐这种做法,希望有人研究一下,并把解决问题告诉我)
1 z& K3 m& ?' I2 N( _8 c# ^为了方便,我直接在一开始加上下面这句,忽略掉。
8 w! c- O3 k+ [0 D6 oimport warnings
% }3 W& E- y2 G7 C7 i% y) twarnings.filterwarnings("ignore")
: \7 B5 A: q3 p9 t
( f6 W$ x) z' U3 x% z. g$ y8 v. ?要点
( q0 ^* }: y7 R, [" o5 e, U
+ x$ V6 A, ~2 f0 G1旋转图像现成的工具很多,一个是cv2提供的,主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图:. n5 `1 x. |# h0 |, q% p! a( y
* h0 P% f' T" l6 v
1 @" K+ W0 G: B8 K# D% y
3.png
8 U5 S' y% [2 f7 r- Z6 H$ S; |. \9 _% M+ D, E- R
这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。0 u$ k* Q& E5 e6 Q
" Q& E. t9 l( J. V: G8 H
这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图
, N9 ?: G5 G8 A2 g. n# q* F; q7 D3 s/ s" ]
. ?4 P! }, d8 t5 ~& ?; n
4.png
* A+ _" B8 c6 v; Z1 @9 L& R6 o, y- s- J+ V9 K/ i/ u
代码#! /usr/bin/env python
- s1 w8 j9 Y% t" {; ^2 x: X# -*- coding: utf-8 -*-* Z( R: l( n5 \6 @/ n  Z
# ! python3
+ ^! i, a- ^6 n: H$ }. _. Q0 y
. Z* Z. H) @3 o+ ximport cv2( F& K# t9 D8 @1 Z- N
import numpy as np
3 F- p5 X0 L0 O6 t$ i8 ]from PIL import Image, [& y7 @- _0 M' n& w2 j  K7 h
from matplotlib import pyplot as plt0 v, P/ B* m. v0 s4 R9 T! t# `
import matplotlib.image as mpimg3 B8 V0 l, m5 ~8 o: v( p

1 f  |/ f- d1 }2 f" A6 Vdef rotate_image(url):
7 T& t% t" K) v2 D6 c8 `        #旋转图像,并将其保存为4种角度的图片- L3 H( Y& p! e) A
    im = Image.open(url,"r"); t" Q, }- v  t" t+ \$ w8 t( h! A* W) q
    im = im.convert('RGB')  #避免有些图报错
! C" T# z: y1 Z' B) n6 G2 n: a    im.save('image_test/test_0.jpg')
) l7 i. i  k& n1 w8 }+ O, @- N    im_90 = im.transpose(Image.ROTATE_90)
1 {, s% q* C" F( R8 e    im_90.save('image_test/test_90.jpg')- z9 x5 y4 s, m; R! S
    im_180 = im.transpose(Image.ROTATE_180); B$ o6 j8 w0 w6 W, t6 D6 ~8 P+ N( W( [
    im_180.save('image_test/test_180.jpg')
0 w' J% N  [( _, t8 t9 m: n    im_270 = im.transpose(Image.ROTATE_270)) M# x% E: s3 r) r5 }2 m. _# u8 w( |6 _
    im_270.save('image_test/test_270.jpg')* T# S8 x3 @" ~. H# m8 \

* _. {5 Z* P: I9 O! s% ^def plt_merge_img():9 ~  S2 B, E$ B1 p5 B
        #将保存的四种角度的图片,叠加在同一张画布上5 f. _/ C; X; M5 }' n, p3 A$ v
        #使用plt.figure()创建画布,并用add_axes()来分割区域显示图片' W; |  P# D7 y2 F8 X. j
        #显示画布,并将其保存为fig_size.png5 n1 m+ y1 k) {: I+ p3 i) z
    img1 = mpimg.imread('image_test/test_0.jpg')  w; `2 M+ j" E  G# h( N/ S6 y
    img2 = mpimg.imread('image_test/test_90.jpg')
# l4 s! I" W' b2 O* y7 R  z' `, i    img3 = mpimg.imread('image_test/test_180.jpg'): g2 H% S8 P0 M' @" u
    img4 = mpimg.imread('image_test/test_270.jpg')- f: \- ]" k4 z/ w4 e( V
    fig = plt.figure(figsize=(60,59),dpi=96)
) x3 \6 n2 v0 z, |' b# w7 V* K3 F% `! }7 c2 {
#上方的横图; z8 T* i6 s+ X- r" j( G9 h
    ax1 = fig.add_axes([0.30,0.55,0.42,0.28])
& h" N4 ^  i; K3 M    ax1.imshow(img1)
& X. T, A6 [( q    ax1.axis('off')
5 |! r$ d' o) c) E/ @: I
; }$ N1 t% P. N, d$ b7 b# 右方的竖图$ R! s2 W- E5 W( v
    ax4 = fig.add_axes([0.67, 0.29, 0.28, 0.42])2 T! i* D6 U6 E( V' Y# R. }+ K; H
    ax4.imshow(img4)
5 u. U, g7 l5 i+ Y: X4 u    ax4.axis('off'), {0 U  ~; s" I" c* O

2 a5 D* [- J0 R# 下方的横图
4 E# e, h4 p& }/ E    ax3 = fig.add_axes([0.30, 0.18, 0.42, 0.28])
+ U7 z/ c2 p7 _8 R2 e/ s    ax3.imshow(img3)
. {! V3 n+ q: Y( A    ax3.axis('off')
' n8 D: w% E( |* H
% ]  l0 v3 I8 n, z* E& p' u$ n#左方的竖图" g$ S& g; c, _. y
    ax2 = fig.add_axes([0.07, 0.29, 0.28, 0.42])
0 @9 G7 u% H) R" a; V4 \    ax2.imshow(img2)# y) j4 k. X# }9 C
    ax2.axis('off')$ u# q: H& i9 ~2 `/ l' `
    # 保存为sig_size.png
9 O. S' t5 m1 {. @    plt.savefig("fig_size.png",dpi=96)
  F8 R+ x6 _4 A# P$ d    plt.show()
6 r+ x4 s8 N; r$ y
( V4 z* w2 g$ Rdef main():) L- D) ]% T/ Q+ F0 O8 s7 d
    url = 'test_1.jpg'$ O( r- a4 k; N# U0 }1 h
    rotate_image(url)9 @4 F6 B, f0 i2 j8 {
    plt_merge_img()( `5 G) }: j; u! o6 ?. K

: w$ t% E+ B0 D3 e. Mif __name__ == '__main__':
6 @1 c4 e; v2 U    import warnings- Z6 `4 c- F3 |' P! o+ t6 l
    warnings.filterwarnings("ignore"). a+ k8 g6 G6 Y7 v! }' N2 I
    main()2 [; v9 z. Y; Y; }; T, b

3 }: y% E) p3 k* m. Y& ^————————————————# e, w4 a, T$ |$ f7 i+ |, u6 Q3 D
版权声明:本文为CSDN博主「你要啥自行车」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
8 B$ ?# s/ }, y原文链接:https://blog.csdn.net/weixin_42572826/article/details/1060337090 t8 U4 o2 }/ p
  A, h9 n" G! \2 ]4 \, o6 Z

8 P1 d; c8 Y% ^* T% W( t3 t" b( a+ E0 R2 n) @

作者: chace    时间: 2020-5-11 12:57
感谢分享
' l+ l; K! X1 ^) V0 A




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