数学建模社区-数学中国

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

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

6 d1 W* b1 w. t5 B  j+ n, X0 f5 I4 X1 spython4次旋转图片后,多图叠加显示
8 _" c1 ]# V8 Z# u' N0 A[color=rgba(0, 0, 0, 0.74902)]文章目录% H, I* l7 V$ K" g4 Q) K) |
" @, r8 s  u8 x, x+ V5 C. v& E
[color=rgba(0, 0, 0, 0.74902)]前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog" [7 r5 j6 y) t! Q% h: t
想要的效果对比,原图VS显示 1.jpg 1.jpg & {# h/ ]- B8 [; o/ |

1 ~# z6 j9 U$ E
2 w/ ?) q2 c. ~问题
- |8 k! q  J0 B" B1 `# r
( Q9 V5 n0 A" C& y7 [6 V0 ?(1)在刚写出来时,在rotate_image()函数中没有加,im = im.convert(‘RGB’)这句话,就会出现有的图正常,但是有的图报错,无法保存,并显示下面这句话8 B6 h. m+ E( k4 ?# [$ U

" W0 n9 S2 `( {这个问题可以在这一篇blog找到解决方法。就是im.read(url)后,再将图片转换为RGB格式(image.convert(‘RGB’))。这样就可以避免很多因图片导致的问题
- A4 J* K; F7 {& U: W; _1 g7 a) i/ r' K* W
(2)在matlabplot中,显示图的第一步是创建画布,plt.figure(),然后在画布上添加子图,最后显示整个画布的图像时,并且让子图自适应来显示。而我遇到了这个就是关于self.figure.tight_layout()的警告,见下图。
4 y" r' i; J! m: v6 W+ L. O
2 B8 M7 l* r; v: f1 t6 Z一般在使用plt创建一个画布后,程序本身会有一个自动调整子图尺寸来使用画布的情况,但是因为我是显示图片,所以这个自适应就出问题了。但是还好,只是警告,不是报错,为了方便,忽略就好…(但是我不推荐这种做法,希望有人研究一下,并把解决问题告诉我)! _8 l% |+ o9 H" O5 t
为了方便,我直接在一开始加上下面这句,忽略掉。
8 g" J% b! C) J9 B( c3 qimport warnings
/ O5 K8 g! o1 xwarnings.filterwarnings("ignore")6 Z* }9 e! N' w! K

2 b' q1 f9 v) i8 @2 ?要点
) G  u' x, G2 j4 u$ `- y; L$ y8 J) Y1 {7 p
1旋转图像现成的工具很多,一个是cv2提供的,主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图:0 @  [/ _0 Q* E7 k$ a. o
' x1 T5 o" L" _* E) _  n" y3 o

7 x, G0 ?2 [& l" Q* R 3.png ) m( j) C: V7 O% t' W% m2 {) I/ K
  j9 v5 O0 }2 [2 ~
这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。
- B* z5 {: Y7 J" m4 T) \" u4 J) I% S+ J8 l
这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图
( {# U" l* ?" O5 x- U6 V( T' q6 i
' ^- K& d1 }. V9 X3 U* W* X* g* q$ I# q4 G
4.png 7 F+ x) f% _, k. {; Y7 \( C% z. d

) F' M% m, h$ m: n% v, {代码#! /usr/bin/env python4 d# `9 ^7 E4 K) e( A; ?4 H4 {
# -*- coding: utf-8 -*-
: S8 ^5 Y; k) v# ! python3# ?$ P) ^( D7 ~) `4 T

% C1 V/ C9 y. F6 s% N  O" Cimport cv2
2 c# F8 @! Y0 K. Zimport numpy as np7 h  n/ D8 v$ W, F7 ^& I4 C
from PIL import Image
% a8 ]+ F; d8 ^8 lfrom matplotlib import pyplot as plt
( l( Z5 b2 e7 k6 L# X6 [6 V( Rimport matplotlib.image as mpimg
% c. X0 s4 x. h/ }1 E
% H2 R+ x6 O+ b' c+ Edef rotate_image(url):
9 u/ G; W% R/ g! g2 O- f" g        #旋转图像,并将其保存为4种角度的图片# j1 p( q" V/ i8 [% ?
    im = Image.open(url,"r")
0 _$ ^1 L% w  ?5 B* [    im = im.convert('RGB')  #避免有些图报错 : p& L4 D/ O. B4 u5 h- p
    im.save('image_test/test_0.jpg')5 ]8 l. l" N( r6 |0 N$ q
    im_90 = im.transpose(Image.ROTATE_90)6 O$ ^. S( w  G
    im_90.save('image_test/test_90.jpg')( F' M: y. [2 v0 x7 _
    im_180 = im.transpose(Image.ROTATE_180)- ~- M  a) [, _5 U; [
    im_180.save('image_test/test_180.jpg')
; y3 N) S( `; \. R& d& N" s    im_270 = im.transpose(Image.ROTATE_270)
' h5 k% X5 g: D; d    im_270.save('image_test/test_270.jpg')
. x8 D: C* Z7 D( k7 l! e+ q! L0 O4 P8 L0 b
def plt_merge_img():3 C3 h5 M6 S/ z4 G
        #将保存的四种角度的图片,叠加在同一张画布上
* r  `6 c3 ]: H# x2 a: m        #使用plt.figure()创建画布,并用add_axes()来分割区域显示图片' T2 O! d' z* {/ W- R$ g
        #显示画布,并将其保存为fig_size.png: \. [" y+ s7 E) r5 ^2 k/ O. v' b7 ~
    img1 = mpimg.imread('image_test/test_0.jpg')
- ^- w: m. D6 w, A. m' w    img2 = mpimg.imread('image_test/test_90.jpg')3 @  Q& ^- G% l
    img3 = mpimg.imread('image_test/test_180.jpg')
1 q' z7 s4 c- j2 g- C. J    img4 = mpimg.imread('image_test/test_270.jpg')* _& X6 l! J9 E: L
    fig = plt.figure(figsize=(60,59),dpi=96)
- l' B" _- n5 E) `0 r
; K% T% v5 {6 r( o#上方的横图) h) e$ X) z' q( L
    ax1 = fig.add_axes([0.30,0.55,0.42,0.28])  x0 m: T  u" U, e
    ax1.imshow(img1)  s7 v9 l$ j9 V' l
    ax1.axis('off')! K' g' |1 _4 |9 [& K

/ y" g$ h# n& U5 ^  y2 ?- a# 右方的竖图  }9 Q" V; e1 F+ H, c* `6 _1 F: v
    ax4 = fig.add_axes([0.67, 0.29, 0.28, 0.42])
# W( f+ O2 k) L- a$ K" ]# P- \7 u    ax4.imshow(img4)! I( X6 L2 J# X: E7 C% @7 d
    ax4.axis('off')
2 z4 G8 v! \. G6 f3 d4 F% m# Z
8 g' X7 C9 s% Y8 r0 p) O8 `) }6 i# 下方的横图9 Q6 K# [  K4 h# B; X; ~
    ax3 = fig.add_axes([0.30, 0.18, 0.42, 0.28])
; s) [1 g! x8 x4 H: J- C    ax3.imshow(img3)6 R& k. g. u7 V2 f1 q$ B" ~
    ax3.axis('off')
( \6 p. M1 k4 l* [5 q9 _$ l  A; a/ _1 q, i1 g9 p
#左方的竖图9 V3 |; n$ \7 G
    ax2 = fig.add_axes([0.07, 0.29, 0.28, 0.42]): @$ N, J* ]7 Q8 N: L7 ?- g
    ax2.imshow(img2), F1 s) p; L3 S! D$ P
    ax2.axis('off')
% _9 X& m9 A& P4 a2 M" I+ K6 U    # 保存为sig_size.png
' b, o- N' G5 z2 U* F    plt.savefig("fig_size.png",dpi=96)
% c0 |9 e: x% u: R    plt.show()
: w* s/ L) _7 j; Q: U( v# f3 {1 ]( U# n. R3 v5 D  t( M3 I
def main():
" C5 O# I1 M; `8 i+ p    url = 'test_1.jpg'
7 _- ~* Z0 L4 A- k' F1 |2 H) V7 I    rotate_image(url)
, V9 ?3 F5 H  Y* E; A& A/ O    plt_merge_img()
) s4 j" k1 c) \* ?2 H( x# q, f" y; u8 ~' N$ n: N2 D
if __name__ == '__main__':4 b+ r9 X& ~3 M! B
    import warnings
( k; }1 f6 X% t8 j! J! F8 X    warnings.filterwarnings("ignore")
0 ^/ L& x4 a) ~. X    main()  ~4 ~# @0 d( L$ F. j6 s" i
8 M# d$ {  Q3 z& L; i
————————————————
0 w& X; U, |' N& k3 v* M7 [! C版权声明:本文为CSDN博主「你要啥自行车」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
# A$ ^2 y& o  T  n# B) a原文链接:https://blog.csdn.net/weixin_42572826/article/details/1060337092 D1 W& [8 r, g+ \, \
- y, F5 X; U6 z# R* d
7 |1 N4 a$ Y2 {8 H
* r6 z; g/ _# S1 v- o$ a! H

作者: chace    时间: 2020-5-11 12:57
感谢分享
5 Q5 D( L; r+ M4 h7 G/ b




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