数学建模社区-数学中国

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

作者: 杨利霞    时间: 2020-5-10 16:27
标题: python4次旋转图片后,多图叠加显示
; d8 Q4 V0 P( X4 Q
python4次旋转图片后,多图叠加显示6 T2 W" x9 Z% d# Q% u7 r
[color=rgba(0, 0, 0, 0.74902)]文章目录$ n0 K( D& J) `  k& @* C8 B; V
2 N  z7 C' u2 o8 e
[color=rgba(0, 0, 0, 0.74902)]前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog
& _& \7 _$ V' t8 J想要的效果对比,原图VS显示 1.jpg 1.jpg
+ g9 H- R  O  p" G) Q
6 J' `3 Q$ h! d2 d6 r5 }
& I& c) A# C" w问题" c5 n) `7 R' v/ m7 U
7 h% a1 E* p% i5 c' ^) ~
(1)在刚写出来时,在rotate_image()函数中没有加,im = im.convert(‘RGB’)这句话,就会出现有的图正常,但是有的图报错,无法保存,并显示下面这句话$ \& ]5 D( p" F. `/ X* Q; E' X7 m

% I+ k2 M) L7 f- I& W这个问题可以在这一篇blog找到解决方法。就是im.read(url)后,再将图片转换为RGB格式(image.convert(‘RGB’))。这样就可以避免很多因图片导致的问题) s* T  e( o# x. J

4 J' N! V# h: l7 |8 Z  w4 P(2)在matlabplot中,显示图的第一步是创建画布,plt.figure(),然后在画布上添加子图,最后显示整个画布的图像时,并且让子图自适应来显示。而我遇到了这个就是关于self.figure.tight_layout()的警告,见下图。5 d4 [) S) @+ ?5 E1 x$ u
4 D. u) k( z9 a7 B
一般在使用plt创建一个画布后,程序本身会有一个自动调整子图尺寸来使用画布的情况,但是因为我是显示图片,所以这个自适应就出问题了。但是还好,只是警告,不是报错,为了方便,忽略就好…(但是我不推荐这种做法,希望有人研究一下,并把解决问题告诉我)
; [6 U$ g2 k3 v8 S为了方便,我直接在一开始加上下面这句,忽略掉。6 l* {3 Q7 b' b. E. f$ R- j
import warnings
2 _$ e1 _, l9 L6 e. Zwarnings.filterwarnings("ignore")
8 \" G/ B* i4 P5 [& t
. |" F* I; S& }" ^5 t1 s2 B/ ?要点
/ ]0 L$ H% b* G: h1 ?/ P3 s
$ r/ E, Q  m8 W2 _+ q! ^$ x1旋转图像现成的工具很多,一个是cv2提供的,主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图:
+ f5 X! A1 D" m: f4 Q8 s; @& [7 z0 D4 Z; J& w  h  L2 a! a/ S/ W

7 x/ V$ p1 Y, q) T 3.png # P! M7 ?8 A$ K4 s2 w6 E
( P  a$ F" M& ?+ t# u  m! L3 ~) u
这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。
) |( e: C# p, I
1 C! E& d& f: _4 R这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图1 p( J, A( w4 Y' r/ p
% I0 @: \# Q3 ~$ }+ h

+ k/ N4 x3 M$ ^. ?7 D. r 4.png
( D# i! K9 I# R" ^: e" D- I0 ~3 e7 u
代码#! /usr/bin/env python
" ]7 T/ ]- F9 d; b4 N, j5 K# -*- coding: utf-8 -*-0 v. ^% ~& v. W1 t* T* {& K2 [0 ]
# ! python3
, i* ?8 A9 {+ J4 {7 G( }  u$ X# k; `6 ?
. M3 L2 m, }6 ]import cv2' c1 E' o2 ]2 T9 p- e
import numpy as np
: F8 P- ]* H  ~. \' I! n0 Wfrom PIL import Image2 r7 i( I# b( B6 w! v% e
from matplotlib import pyplot as plt
/ l' A4 B  v9 l4 ~import matplotlib.image as mpimg
5 q# K6 E  ?/ k) r3 ^) m( L. B
def rotate_image(url):" N( x7 M# l0 D3 W! Z) w, H
        #旋转图像,并将其保存为4种角度的图片
; U9 }  Z6 V! a  M    im = Image.open(url,"r")
+ h$ Z( U4 A7 u" a! P2 B    im = im.convert('RGB')  #避免有些图报错 ' G7 g; }* L! I  E" N
    im.save('image_test/test_0.jpg')
) |' P& @% x0 p; V9 T7 I  H7 C    im_90 = im.transpose(Image.ROTATE_90)' T, C# y; {" H/ b
    im_90.save('image_test/test_90.jpg')7 i+ ^% k6 o2 c/ L0 _$ d& s
    im_180 = im.transpose(Image.ROTATE_180)& d$ M! |" `& _0 m7 e/ g
    im_180.save('image_test/test_180.jpg')
* M  R) K9 w: J; t    im_270 = im.transpose(Image.ROTATE_270)
  G: a8 S# O8 @    im_270.save('image_test/test_270.jpg')+ [- l, D6 {2 {* `. }

- A- h0 G  k$ K' odef plt_merge_img():
3 h& t' O$ y2 C7 i7 x: I        #将保存的四种角度的图片,叠加在同一张画布上0 Q% N2 e9 H. _. W4 t
        #使用plt.figure()创建画布,并用add_axes()来分割区域显示图片/ w( f9 {7 ]6 N8 I! m8 w
        #显示画布,并将其保存为fig_size.png5 b, J$ ?# U& i0 I6 N) W$ _
    img1 = mpimg.imread('image_test/test_0.jpg')  C$ [% Z" v! k1 z
    img2 = mpimg.imread('image_test/test_90.jpg')
7 _$ x7 v* ]. W. y# F, a% e: N    img3 = mpimg.imread('image_test/test_180.jpg')
. O% M# s0 F. p. r5 b* W    img4 = mpimg.imread('image_test/test_270.jpg')
( ^: |/ r8 z" i% t5 h3 I7 V7 T; N    fig = plt.figure(figsize=(60,59),dpi=96)
1 K% s& |2 D7 B6 ?8 H6 X' b$ T5 |4 A; |' C+ t' f9 y% O# [
#上方的横图  h" g# W8 \' R. I! j/ y0 j
    ax1 = fig.add_axes([0.30,0.55,0.42,0.28])' X$ X6 o$ V2 A0 [6 W. H
    ax1.imshow(img1)7 K' J0 H2 S/ B
    ax1.axis('off')
5 n- l! c1 i+ F0 v& j5 ^4 v- K$ |6 ]! O; e+ t- |  k% R" h5 H9 l
# 右方的竖图( x% B5 o  p  \5 E. `, a
    ax4 = fig.add_axes([0.67, 0.29, 0.28, 0.42])
! R. a+ C; G, A4 E1 G    ax4.imshow(img4), W1 t- O: A$ {: N* M% N
    ax4.axis('off')% z3 @% N1 ?; K6 `) I4 a' k) l+ v

# f9 d4 d* P# j# 下方的横图8 L7 @6 e! b) Q+ a5 @
    ax3 = fig.add_axes([0.30, 0.18, 0.42, 0.28])+ C% a. x' c- N( y, B
    ax3.imshow(img3)( V) ]1 j/ L! j
    ax3.axis('off')1 I8 y( Z$ S/ @# h* k8 m

* \$ a/ L0 q+ a' w4 p" w#左方的竖图! Y) ^0 S9 B. A: A" r! \7 }
    ax2 = fig.add_axes([0.07, 0.29, 0.28, 0.42])
% S0 q" r5 C2 H: Q" g* n# F: D    ax2.imshow(img2)$ k( M5 j6 s5 O  P
    ax2.axis('off')" n1 _  O+ I5 g) }% R
    # 保存为sig_size.png
9 o+ g" x7 i/ G, b7 Q    plt.savefig("fig_size.png",dpi=96)3 a; c9 ~8 c1 c1 w
    plt.show(): E& E) `" F& @" X8 E

7 ~5 o% B& g6 X) l' }2 pdef main():
6 d, e7 C2 Q+ h    url = 'test_1.jpg'
) ^, P; y% u4 v. e5 K' x    rotate_image(url). E( q4 m  J; j3 R# C
    plt_merge_img()9 z  X% d, S7 }1 ?

7 J& p. {, @( _) D# z9 Z1 ^if __name__ == '__main__':
% S4 h3 ^7 r, c1 ]' m    import warnings
% Q" k4 o5 L9 v6 l    warnings.filterwarnings("ignore")
# o) ?& l, u" o+ K    main()
$ R2 F  u( w6 m. k; s: n+ E
# v' H6 ]6 Z$ q! B) a  h; g4 Q  G————————————————1 V; C. T9 V7 t3 Z8 p1 j+ N
版权声明:本文为CSDN博主「你要啥自行车」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。5 H* {! W( g8 s' [8 r# o
原文链接:https://blog.csdn.net/weixin_42572826/article/details/106033709
4 K6 e1 H3 ~# v& I6 u5 v9 G" n" s% Z7 g/ [

7 x6 @% m4 L& K& E  l, e5 P$ K. t* T& K5 _* _

作者: chace    时间: 2020-5-11 12:57
感谢分享 2 w& j7 c% V. J( w* s/ d  F. e





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