数学建模社区-数学中国
标题:
python4次旋转图片后,多图叠加显示
[打印本页]
作者:
杨利霞
时间:
2020-5-10 16:27
标题:
python4次旋转图片后,多图叠加显示
8 n$ v& U4 _# k* w
python4次旋转图片后,多图叠加显示
* t, Y6 s* l t
[color=rgba(0, 0, 0, 0.74902)]
文章目录
" E' P+ Z% i R
想要的效果对比,原图VS显示
问题
要点
代码
8 A& U: t3 e/ Y" H# j% ?3 p* c
8 _; p. [# P5 b& A) E
- G" D+ L: {# Q$ U& y( ~
[color=rgba(0, 0, 0, 0.74902)]
前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog
* k1 L4 B3 l) W
想要的效果对比,原图VS显示
2020-5-10 16:24 上传
下载附件
(76.02 KB)
2020-5-10 16:24 上传
下载附件
(76.02 KB)
0 _) _. D) u& y: a. U9 I9 k2 G
4 y+ w1 ~7 Y1 G% y
+ Q( W9 P$ y: x! W' u' C- H
问题
2 e) Y! O* v# i8 \0 A: O
9 F9 r/ `- k* I$ [7 W- q, d
(1)在刚写出来时,在rotate_image()函数中没有加,im = im.convert(‘RGB’)这句话,就会出现有的图正常,但是有的图报错,无法保存,并显示下面这句话
& W- P$ F5 |3 _ f! H, l3 g) M
4 p% Z2 c7 X! X ~# X" }1 M9 h6 k% h- b
这个问题可以在这一篇blog找到解决方法。就是im.read(url)后,再将图片转换为RGB格式(image.convert(‘RGB’))。这样就可以避免很多因图片导致的问题
- g! m. H2 W' l: \
4 i5 [" f- |, J8 `( { n
(2)在matlabplot中,显示图的第一步是创建画布,plt.figure(),然后在画布上添加子图,最后显示整个画布的图像时,并且让子图自适应来显示。而我遇到了这个就是关于self.figure.tight_layout()的警告,见下图。
+ y! g. `7 t2 q
/ I* W5 W2 a( ^0 N
一般在使用plt创建一个画布后,程序本身会有一个自动调整子图尺寸来使用画布的情况,但是因为我是显示图片,所以这个自适应就出问题了。但是还好,只是警告,不是报错,为了方便,忽略就好…(但是我不推荐这种做法,希望有人研究一下,并把解决问题告诉我)
% x$ D( k3 O4 X) f& K
为了方便,我直接在一开始加上下面这句,忽略掉。
6 Z* @* l$ O T1 } A6 {" K
import warnings
' k9 ~% a5 S; D$ `
warnings.filterwarnings("ignore")
& o+ ]6 S% A- Z
1 X$ E) d4 v# n* ^* Y- ~6 x
要点
$ o) ]: Q& L5 T! W9 @
5 K8 N* c; I5 s* Z/ Y, [
1旋转图像现成的工具很多,一个是cv2提供的,主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图:
) `# C& D6 b! I4 u% S2 i: F
' e9 V/ o4 |3 }& V) k1 \
8 y5 j3 y) S" y1 A: [
2020-5-10 16:25 上传
下载附件
(368 KB)
9 {" n& }- j6 q. c
9 o7 a' \; \2 z6 M1 r3 I6 O* S5 V
这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。
* X9 _! [. {3 T1 _
$ \( K. E" B& o, f
这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图
" \4 W- a8 Q+ T, S/ i6 g
% b9 F! g9 K2 W
6 n" O% y+ N) k: }6 w+ K; s
2020-5-10 16:26 上传
下载附件
(56.87 KB)
& @0 Q2 Y9 J/ G
8 B- D& W4 j+ ]5 p2 k
代码
#! /usr/bin/env python
7 M. I6 A* |% ? j0 C* M" e
# -*- coding: utf-8 -*-
* a6 ]; w# Q- z" A2 D0 Z1 H+ l# E
# ! python3
# h0 x5 F0 R/ z
: I) {7 m+ o/ O% Y% D" G. i/ e! C
import cv2
" Y7 v. c; ^5 p. T5 Q( h. y3 F
import numpy as np
" p1 \' ]6 P- O* n4 \0 U# \
from PIL import Image
3 F8 S0 t$ \( T2 o! ^) N; H
from matplotlib import pyplot as plt
1 O1 [+ q6 l0 I" B' P0 {/ A
import matplotlib.image as mpimg
, Q% |" m- T* ~
$ q( D" g& S1 r. H7 a; {* c4 @
def rotate_image(url):
8 M6 W4 q1 y% v' Z- L
#旋转图像,并将其保存为4种角度的图片
% S8 Q2 l3 Q: s
im = Image.open(url,"r")
* |1 }$ o" X" v6 |
im = im.convert('RGB') #避免有些图报错
0 m2 y; `( v% o) V2 B2 Q- O, ~
im.save('image_test/test_0.jpg')
) L7 l2 o+ d5 S9 X7 V8 y
im_90 = im.transpose(Image.ROTATE_90)
; }# V9 Y7 j2 g4 V' S
im_90.save('image_test/test_90.jpg')
5 }2 y+ ~; r2 O9 t
im_180 = im.transpose(Image.ROTATE_180)
! C; h' o# c0 O
im_180.save('image_test/test_180.jpg')
- p5 f, c( ~ f" i8 Q( B+ n
im_270 = im.transpose(Image.ROTATE_270)
8 u+ _# ?! x* x1 b$ K/ h2 ?
im_270.save('image_test/test_270.jpg')
8 q' [4 O! S9 A
9 c8 w# W4 H6 S" S- v' L
def plt_merge_img():
# D T; v, n$ f' Q: I
#将保存的四种角度的图片,叠加在同一张画布上
- W* o. f6 z# }- Q' R" R+ u
#使用plt.figure()创建画布,并用add_axes()来分割区域显示图片
4 d! |/ |5 ~& w5 V/ H( r* a/ D
#显示画布,并将其保存为fig_size.png
2 t3 Q9 j% B) [2 M# [
img1 = mpimg.imread('image_test/test_0.jpg')
7 b5 s$ I u: I3 O
img2 = mpimg.imread('image_test/test_90.jpg')
1 z) s5 }' j! ]
img3 = mpimg.imread('image_test/test_180.jpg')
8 D/ u* n0 c) i
img4 = mpimg.imread('image_test/test_270.jpg')
! @# c0 x. V, {2 b
fig = plt.figure(figsize=(60,59),dpi=96)
! H+ _; U6 L% ~6 Q; s1 P
! f; r6 d3 g, }9 D+ u7 R3 d
#上方的横图
, i$ Q5 S/ F$ f0 ~; V$ Y
ax1 = fig.add_axes([0.30,0.55,0.42,0.28])
$ V2 @# t+ e. j! d* }4 s. b- a- n6 r' t
ax1.imshow(img1)
& _( C% I) F4 w' l
ax1.axis('off')
& g4 L* b) j F
2 P' W7 S% G! u* V
# 右方的竖图
B, e% V- k: h, w9 ]8 X
ax4 = fig.add_axes([0.67, 0.29, 0.28, 0.42])
; { t4 h G# u3 T: ?4 j; d F
ax4.imshow(img4)
i8 i d3 k3 @& H4 H0 D4 `1 P
ax4.axis('off')
+ D6 E, h6 J/ k" [% U; }* l, K
! U$ j; W# [% V1 p/ s0 j
# 下方的横图
# p4 }* y5 f! O
ax3 = fig.add_axes([0.30, 0.18, 0.42, 0.28])
9 b: O3 S, _# ~8 P; e
ax3.imshow(img3)
2 S3 C2 z) F p7 B
ax3.axis('off')
- J& F% z% f' B' O
7 p H. u& N9 \/ `, k1 s& D+ U# W3 k
#左方的竖图
1 W0 K% r, N, F9 m3 H
ax2 = fig.add_axes([0.07, 0.29, 0.28, 0.42])
; [: Q" j. W" e! Q" Y) n! q
ax2.imshow(img2)
% t" N+ ` I9 O
ax2.axis('off')
4 r0 h2 y; Z1 ?4 N3 j1 t( [
# 保存为sig_size.png
" P: W) T _- Q- W1 b# v
plt.savefig("fig_size.png",dpi=96)
, f1 t* P" u2 A1 F8 e
plt.show()
6 P1 a: l& V1 p5 _
0 q9 Z) |1 b" v6 i
def main():
, _6 I G( ]3 r) z
url = 'test_1.jpg'
# d) ?+ J6 |: b8 Q* @' T- l# I: v
rotate_image(url)
& q% h5 g1 r+ K+ _8 c- X
plt_merge_img()
9 E0 Z: G7 {# Z4 x( ]
% a; z& `; f& S7 W; h( K" W( a7 |
if __name__ == '__main__':
0 l7 x) s1 y5 i5 D) T4 g/ D# M' V$ v
import warnings
1 o8 _2 Z, Y- @# p
warnings.filterwarnings("ignore")
7 t$ v l# J+ R0 {5 n! {( _! a, H* ]
main()
; |7 \$ ]6 D! {5 D
, \" I# s9 S& x# B% R# v2 N3 z8 I0 X
————————————————
( h/ B$ ~; M8 }6 I3 k
版权声明:本文为CSDN博主「你要啥自行车」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
( m8 N% j: ?! k- p1 A
原文链接:https://blog.csdn.net/weixin_42572826/article/details/106033709
* q2 }, R+ e$ Q! W( S- F
7 D0 e( n$ @0 P; X6 I5 t d
4 ~* ~- m* p6 d
m! _- f% t1 [! C8 \+ n$ H
作者:
chace
时间:
2020-5-11 12:57
感谢分享
, K3 {, c" U, o$ P
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5