在线时间 1630 小时 最后登录 2024-1-29 注册时间 2017-5-16 听众数 82 收听数 1 能力 120 分 体力 563400 点 威望 12 点 阅读权限 255 积分 174243 相册 1 日志 0 记录 0 帖子 5313 主题 5273 精华 3 分享 0 好友 163
TA的每日心情 开心 2021-8-11 17:59
签到天数: 17 天
[LV.4]偶尔看看III
网络挑战赛参赛者
网络挑战赛参赛者
自我介绍 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
群组 : 2018美赛大象算法课程
群组 : 2018美赛护航培训课程
群组 : 2019年 数学中国站长建
群组 : 2019年数据分析师课程
群组 : 2018年大象老师国赛优
; G: w0 ^: o0 q4 _) h, p4 m9 V python4次旋转图片后,多图叠加显示
" a: c0 j J; A2 w* q0 P' Q [color=rgba(0, 0, 0, 0.74902)]文章目录 8 a( r: L _5 ]* K% ^& m, |! e# Q: q
想要的效果对比,原图VS显示 问题 要点 代码
% u, T$ l2 e6 V; {$ T8 f w / ?* B$ u% \- b
# j) v4 E! J: R4 |8 P) q: e) A [color=rgba(0, 0, 0, 0.74902)]前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog , |; h8 G G7 C
想要的效果对比,原图VS显示
) I) v6 k# |/ _8 ]1 E, k7 x! p4 K
' E. X9 x; a* P+ p; Q
8 N. [0 {0 w$ p8 J5 ~0 I
问题: Q0 Z" }6 v6 w7 `% R/ C
8 H1 T( x5 w% N4 W& i
(1)在刚写出来时,在rotate_image()函数中没有加,im = im.convert(‘RGB’)这句话,就会出现有的图正常,但是有的图报错,无法保存,并显示下面这句话
5 e$ V* g* y" A; ^; y- s
2 n; d4 b/ \& R; ~ 这个问题可以在这一篇blog找到解决方法。就是im.read(url)后,再将图片转换为RGB格式(image.convert(‘RGB’))。这样就可以避免很多因图片导致的问题
/ M! x- N! ?7 |: v) F6 h' l! a7 r
: O; A2 \ h9 T5 {, W$ o% C (2)在matlabplot中,显示图的第一步是创建画布,plt.figure(),然后在画布上添加子图,最后显示整个画布的图像时,并且让子图自适应来显示。而我遇到了这个就是关于self.figure.tight_layout()的警告,见下图。
) I9 X1 Z* ^$ u5 [4 v' f % C* z7 Y3 s" V1 q% A1 J* _% a
一般在使用plt创建一个画布后,程序本身会有一个自动调整子图尺寸来使用画布的情况,但是因为我是显示图片,所以这个自适应就出问题了。但是还好,只是警告,不是报错,为了方便,忽略就好…(但是我不推荐这种做法,希望有人研究一下,并把解决问题告诉我)# @" B3 p/ t H- j. `* D
为了方便,我直接在一开始加上下面这句,忽略掉。
* X* G5 O2 p' q1 ` import warnings
. L! x _# t% V8 h warnings.filterwarnings("ignore")
. l2 @% i- t; A% i- U8 q - c) t; V/ D# c' E J% z
要点+ @1 F: o E7 f6 h5 q3 B: W# \
1 g2 R7 B0 d' W1 x. t1 k 1旋转图像现成的工具很多,一个是cv2提供的,主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图:6 f( Y+ V U2 F2 B+ B
: w% F+ n& r3 Y' @
% N) b2 r& G6 C$ U9 E
3 p1 j7 c N# D- l
* r, p9 S# R- D$ X5 B- h 这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。
3 L$ D# b8 `; G# V8 c ) D9 u% l) N2 a# f' H
这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图
" _0 j6 Q+ s1 z. T
, _: Z$ s( R. d% \. V ( n$ T. R% I' A/ Y! |
3 M6 |! Y% s3 S3 e8 X* X! _
& {+ s# q; ?+ T% z0 h0 U& }' a
代码 #! /usr/bin/env python& i/ w, f: W$ p
# -*- coding: utf-8 -*-
5 ~6 O/ x+ ~0 \ # ! python3) L. C/ T* `, U% y
; Y7 s. R' v6 @( C9 ? import cv2
) H( g( d' a/ d import numpy as np! o- h% c, Q. r: s" j3 |
from PIL import Image. F6 Z. ]) J0 n4 A" N" a$ N
from matplotlib import pyplot as plt9 x3 N' C1 i: r" `
import matplotlib.image as mpimg
4 b) U' \* n6 |
. U4 Y& m8 s" ]6 c- M def rotate_image(url):
6 S# H8 @% X1 z H$ j7 m5 s #旋转图像,并将其保存为4种角度的图片
* A8 E( b4 o) p* t! `$ _+ x: F im = Image.open(url,"r")' L: c2 K0 z" P/ B' b
im = im.convert('RGB') #避免有些图报错
* L% ~5 {, o2 x/ s$ ^4 [ im.save('image_test/test_0.jpg')' s3 F+ `- g6 e& C( f b
im_90 = im.transpose(Image.ROTATE_90)) U* {" e* u/ V2 D
im_90.save('image_test/test_90.jpg')
" f z. A: V: l$ ~. o* O3 u& r im_180 = im.transpose(Image.ROTATE_180)
, y6 [3 R) @ c" _5 K/ z2 n# v$ T im_180.save('image_test/test_180.jpg')& ^2 J/ e! a" p: D# ~' D
im_270 = im.transpose(Image.ROTATE_270)
3 {' ~; @- e9 `, v% K" D8 B* k im_270.save('image_test/test_270.jpg')
1 _: \. b& w' g2 y+ H3 p0 s4 [
, r e( z# |) [/ ] def plt_merge_img():
( \% V, k# l" x$ Y: H #将保存的四种角度的图片,叠加在同一张画布上( p0 I) p' P4 i! c
#使用plt.figure()创建画布,并用add_axes()来分割区域显示图片- _# t/ y8 W {; L
#显示画布,并将其保存为fig_size.png% t0 {) C* [3 Q8 R4 s% Y. a
img1 = mpimg.imread('image_test/test_0.jpg')' Z9 ]* @ j( p: M* V' _" Q
img2 = mpimg.imread('image_test/test_90.jpg')0 W7 y$ a; {. k5 W6 y$ Y
img3 = mpimg.imread('image_test/test_180.jpg')
$ j! y- P2 J- i3 { img4 = mpimg.imread('image_test/test_270.jpg')' i) ?' A9 x0 V7 p- ?2 p
fig = plt.figure(figsize=(60,59),dpi=96)
7 |% @* G/ x" E6 B+ I% R . o" u2 o% J1 c$ A# F8 R, C S
#上方的横图/ ?7 ]3 Y% H" ?" x
ax1 = fig.add_axes([0.30,0.55,0.42,0.28])
, {7 T( V$ n# X r2 Y ax1.imshow(img1)+ t: i& d4 k) d3 C& L1 R9 [; E
ax1.axis('off')
2 L, }0 H: g# w) |7 l0 C% `; l5 f8 S0 G * V" _* [. T6 Y! d" f) y6 z$ w
# 右方的竖图0 K% I/ C( Q8 w5 q* G1 {
ax4 = fig.add_axes([0.67, 0.29, 0.28, 0.42])6 ^& z% A" ]' N. d0 c
ax4.imshow(img4)
" t; J7 m- [8 B ax4.axis('off')
7 R) X( X% J/ Q" o, J/ E1 I ( r! Y9 p9 E& C2 W( p1 L
# 下方的横图/ C# |4 G4 H, |# p! k9 R! N' G
ax3 = fig.add_axes([0.30, 0.18, 0.42, 0.28])
' J7 ?9 ?" Y9 ~" r7 f; T ax3.imshow(img3)
* M. m. b2 v. ]! K' e" I* Y6 M ax3.axis('off')
' L+ x6 _- R: W# _9 ^# ]7 E# B 8 V. M5 }3 ?1 L
#左方的竖图
) ]* K# Y% r) }' e* h4 ? ax2 = fig.add_axes([0.07, 0.29, 0.28, 0.42])
8 [' E8 @* N# N. k, W- w8 b6 s) G ax2.imshow(img2)
7 A) R2 \7 R+ @' v ax2.axis('off')( C0 B- ]: L2 {+ k5 s- C3 O
# 保存为sig_size.png$ Q3 n7 h7 r+ B) t
plt.savefig("fig_size.png",dpi=96)
& J" B. |! O& k0 l plt.show()& }0 `9 O. V/ A8 O! Z5 B( Z
0 ^. x4 M4 `5 { def main():: G% ^0 H' | f9 @( a5 A ?. Q
url = 'test_1.jpg'% {6 N! ^! @: F' {& T) |# ]$ u
rotate_image(url)9 t6 R! i( M4 v& q
plt_merge_img()# ?* _* b3 b) C; i
) D3 y8 E: U! `2 R if __name__ == '__main__':
# Y, D- j: ^# D4 x2 B1 l import warnings
- U; j. m0 _' g o) }% G' _ warnings.filterwarnings("ignore")
! H1 A T4 C: J) R; p/ { main()8 m8 T; f4 T. b/ f% ^: G. H; V
5 l, v' J' O% ]1 f
————————————————
: n( N: E1 O1 ?9 {% v% Z" N: Q8 C2 U 版权声明:本文为CSDN博主「你要啥自行车」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。9 o; _1 q, n2 Z& Q9 J
原文链接:https://blog.csdn.net/weixin_42572826/article/details/106033709
: w- c0 Y$ ^0 N3 ^. F # `# r- i" u1 M. E. A8 `
5 M e( D* t5 v. _8 r
6 [. ]0 O3 f$ J, b* Z7 z0 x: i
zan