数学建模社区-数学中国

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

作者: 杨利霞    时间: 2020-5-10 16:27
标题: python4次旋转图片后,多图叠加显示
, R3 }; \: `9 U# ?6 p  c* R
python4次旋转图片后,多图叠加显示
' c; r5 w/ L% [# a[color=rgba(0, 0, 0, 0.74902)]文章目录
( Z, ?9 Z4 L4 }
! ~5 e4 k: g6 Y# J3 M' f/ {[color=rgba(0, 0, 0, 0.74902)]前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog
) k+ O" T. q. g* q- N  d' M3 j想要的效果对比,原图VS显示 1.jpg 1.jpg
7 ]. T, ~! J, N. h' h; M2 [3 L" A. X9 m: Q$ M3 D8 ^. \; T# D
" |) b7 P  \, m' M: s
问题
- D/ V+ C, V0 b! Y3 c
+ c5 v- D2 |/ c3 f5 F(1)在刚写出来时,在rotate_image()函数中没有加,im = im.convert(‘RGB’)这句话,就会出现有的图正常,但是有的图报错,无法保存,并显示下面这句话* V. {9 I" q/ I2 Y

2 X- B/ w: j8 n0 \这个问题可以在这一篇blog找到解决方法。就是im.read(url)后,再将图片转换为RGB格式(image.convert(‘RGB’))。这样就可以避免很多因图片导致的问题+ Y7 N9 G5 g; ?7 P6 {9 ]4 D

" c! k2 Q, u, `: ~(2)在matlabplot中,显示图的第一步是创建画布,plt.figure(),然后在画布上添加子图,最后显示整个画布的图像时,并且让子图自适应来显示。而我遇到了这个就是关于self.figure.tight_layout()的警告,见下图。
% w, m  `/ d+ R3 g
+ o7 _. s7 Z7 A一般在使用plt创建一个画布后,程序本身会有一个自动调整子图尺寸来使用画布的情况,但是因为我是显示图片,所以这个自适应就出问题了。但是还好,只是警告,不是报错,为了方便,忽略就好…(但是我不推荐这种做法,希望有人研究一下,并把解决问题告诉我)3 q5 W1 t% @. [# [5 I
为了方便,我直接在一开始加上下面这句,忽略掉。2 y( [  B. A7 B% V
import warnings
" ?+ p# B& C6 gwarnings.filterwarnings("ignore")
- }4 i8 l9 _+ F9 r$ h
& v, j* z: h# ~要点8 }! m! u, }6 W: v6 @! |

7 u* o3 F, k" J0 x" D1旋转图像现成的工具很多,一个是cv2提供的,主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图:
# N7 B/ w% {" ?; C; A! R! u$ N, I( \' t& I

# \/ R- {1 P2 ? 3.png
2 d2 I- g) k# g# ?  B) W9 L) I: j' C7 g) I/ u; d8 P
这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。
8 A: c, z7 t" E: }7 B# t* f& u' I3 Q8 C7 Q* C
这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图
( h/ K* h2 Q4 L' f/ i4 p7 i& l
7 E/ {1 e- I' D/ N  g8 I' u, H) ]* z4 f2 N
4.png
$ i. I0 X/ G. K% w  Q7 {# N/ I; R1 g* [/ O5 o4 @; G
代码#! /usr/bin/env python
5 L; Q! Q- y. e) F& J# -*- coding: utf-8 -*-. v# g# L1 K* @. F' ], o: I
# ! python3
5 v* z7 I8 R4 g+ R4 e$ Q% ?3 J1 i, J/ V) T
import cv2
3 a' r# d- J2 R' _3 ]1 X: o6 D$ v, bimport numpy as np
0 h. q% W! q! X& D$ ]% p4 l" Zfrom PIL import Image5 t  w2 [) u* B
from matplotlib import pyplot as plt
+ H0 v+ ?9 U6 n! `6 Dimport matplotlib.image as mpimg- X; a0 r4 D7 ^+ w9 @

* H6 H; ]# x8 c! ]8 G& h1 udef rotate_image(url):) p7 I3 H) P/ J7 i& [
        #旋转图像,并将其保存为4种角度的图片5 J- {. V) M" A% H, }2 e5 P
    im = Image.open(url,"r")
0 {; p% ?# n( O8 A6 e    im = im.convert('RGB')  #避免有些图报错
( s) A( H5 S2 ~; d# Z    im.save('image_test/test_0.jpg')6 T6 f" k# v: o7 s. g* g7 l: f
    im_90 = im.transpose(Image.ROTATE_90); e# M* x/ _- s* L( {- P! ~$ A
    im_90.save('image_test/test_90.jpg')+ s! f  M& z; M* W& j
    im_180 = im.transpose(Image.ROTATE_180)
8 a, M  ~! U; [. @% `; n9 o; n! E    im_180.save('image_test/test_180.jpg')# y. O! x9 d  w2 \! o
    im_270 = im.transpose(Image.ROTATE_270)3 y5 V$ y. A+ q( g, N# G
    im_270.save('image_test/test_270.jpg')
7 {  Q& r' h9 q- V% T9 d* M7 d7 c" h5 n6 ~* n& Z$ Z/ G% f( g
def plt_merge_img():
. T' c* y% u, C. |; k1 \8 w- s: ]' e        #将保存的四种角度的图片,叠加在同一张画布上1 \8 r3 F6 c9 A- n5 T/ e  j
        #使用plt.figure()创建画布,并用add_axes()来分割区域显示图片3 x2 }8 C' ]. a/ [' Z! S
        #显示画布,并将其保存为fig_size.png0 I; {  q$ |3 f+ Z
    img1 = mpimg.imread('image_test/test_0.jpg')2 b: ]; o. p2 \1 v; B1 Q8 p8 q' k
    img2 = mpimg.imread('image_test/test_90.jpg')& [/ f) a2 q' c9 K1 k7 T
    img3 = mpimg.imread('image_test/test_180.jpg')6 \7 q% L8 X% r- a8 J
    img4 = mpimg.imread('image_test/test_270.jpg')
) g# C1 V" Z- E+ p8 J- A    fig = plt.figure(figsize=(60,59),dpi=96)
1 l* K* R5 z, f6 F# G
: w# d1 W% M5 W7 `1 n& p+ w: ^#上方的横图
1 C2 ~5 C) q, ?9 Y2 N* @    ax1 = fig.add_axes([0.30,0.55,0.42,0.28])2 ?$ j' F$ b2 q
    ax1.imshow(img1)
0 ?* \6 }1 d3 x; C- j7 _    ax1.axis('off')' F' r/ h' ~6 x; ]) X7 y
7 I+ D' C8 x: M) D" F
# 右方的竖图
! \' E$ o" }- ?    ax4 = fig.add_axes([0.67, 0.29, 0.28, 0.42])
! J. A9 h2 j: e( ?  t- D0 g, p5 r8 J    ax4.imshow(img4)  T; a' q$ b: \
    ax4.axis('off')
* O0 l4 \1 S1 d" ]$ J- Z" C8 }7 f; d) N
# 下方的横图
3 z. j: o, ]) a9 @' y; h    ax3 = fig.add_axes([0.30, 0.18, 0.42, 0.28])
7 g3 o& N0 ]$ j7 x    ax3.imshow(img3)! u1 R" E3 g/ |
    ax3.axis('off')! w' @! q. J  u) D8 z% B
8 Y# }9 T$ P. H9 j- X
#左方的竖图7 S% `& W1 N5 w
    ax2 = fig.add_axes([0.07, 0.29, 0.28, 0.42])' n: a- o5 J  l1 {7 F/ Y
    ax2.imshow(img2)4 O1 K7 f% j! b+ f1 }
    ax2.axis('off')! W- w, a" h( I  j6 g
    # 保存为sig_size.png# U3 c4 s. Z' t7 G
    plt.savefig("fig_size.png",dpi=96)2 K; O( O/ }( N* f
    plt.show()
; d! b' t, q7 A/ U, U2 c( w: a2 t  P, U/ h1 f
def main():
9 [0 p0 W( B7 g9 h# o3 ^. r" u    url = 'test_1.jpg'1 ], W8 R+ P; u7 j4 U$ r
    rotate_image(url)" a% Y( r1 \; I* G; U0 a
    plt_merge_img()' Y7 u  W' r0 o

8 ^$ w- v0 s, }* u( D0 x* Tif __name__ == '__main__':
/ T) }" H  Y; R' }6 F) I1 z2 f    import warnings' {( Z% d) V5 l
    warnings.filterwarnings("ignore")
$ R5 o" ^: Y+ e0 T5 T* C8 O5 m" ?    main()
- J. B( F! H* C5 c
5 \; y$ V: l: c. Z$ J————————————————. U9 Q. K0 M$ m
版权声明:本文为CSDN博主「你要啥自行车」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。" y% d2 l. z7 n
原文链接:https://blog.csdn.net/weixin_42572826/article/details/106033709) L/ B; w& }9 c- `
$ Z$ v5 n6 k6 i9 ^0 e! S  o' E

1 S" c; s7 j9 h" H) y  S+ @0 S, E" s

作者: chace    时间: 2020-5-11 12:57
感谢分享
) d2 ?; K2 D6 L/ {& w




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