在线时间 1630 小时 最后登录 2024-1-29 注册时间 2017-5-16 听众数 82 收听数 1 能力 120 分 体力 564694 点 威望 12 点 阅读权限 255 积分 174631 相册 1 日志 0 记录 0 帖子 5313 主题 5273 精华 3 分享 0 好友 163
TA的每日心情 开心 2021-8-11 17:59
签到天数: 17 天
[LV.4]偶尔看看III
网络挑战赛参赛者
网络挑战赛参赛者
自我介绍 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
群组 : 2018美赛大象算法课程
群组 : 2018美赛护航培训课程
群组 : 2019年 数学中国站长建
群组 : 2019年数据分析师课程
群组 : 2018年大象老师国赛优
' n% \+ Z E0 v/ h python4次旋转图片后,多图叠加显示
- \5 I& T% J/ W [color=rgba(0, 0, 0, 0.74902)]文章目录
9 o- {" G; w, y/ G 想要的效果对比,原图VS显示 问题 要点 代码 / E6 N M7 c2 w
+ p8 [ \, Q* Y7 b" W& G. m( z- G
' S. v$ \( v1 t$ D$ g& z% U# S Q [color=rgba(0, 0, 0, 0.74902)]前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog ( x) \! l/ w" f9 {$ }9 L( y Z* G. @8 E
想要的效果对比,原图VS显示
3 y6 ~4 L' Y5 i8 n 8 o* f" J9 z. z* z; K
. K' ?8 @7 [2 w, T: t2 }; a& Q9 o+ g 问题0 w+ i# d M0 H. j6 w
2 F% a3 k# o+ s( W4 H5 f) B (1)在刚写出来时,在rotate_image()函数中没有加,im = im.convert(‘RGB’)这句话,就会出现有的图正常,但是有的图报错,无法保存,并显示下面这句话
6 C w6 f% x2 U+ S7 Y! _+ T' i
; B% w b/ B& m+ Z R( _ 这个问题可以在这一篇blog找到解决方法。就是im.read(url)后,再将图片转换为RGB格式(image.convert(‘RGB’))。这样就可以避免很多因图片导致的问题
- k1 }, l1 P$ U7 o; Q# m6 ? 1 _3 O% a: `& Z3 F1 ?. B
(2)在matlabplot中,显示图的第一步是创建画布,plt.figure(),然后在画布上添加子图,最后显示整个画布的图像时,并且让子图自适应来显示。而我遇到了这个就是关于self.figure.tight_layout()的警告,见下图。2 x' e s6 j4 X7 {% d
' }0 i' B& q' C; y4 k" r. L 一般在使用plt创建一个画布后,程序本身会有一个自动调整子图尺寸来使用画布的情况,但是因为我是显示图片,所以这个自适应就出问题了。但是还好,只是警告,不是报错,为了方便,忽略就好…(但是我不推荐这种做法,希望有人研究一下,并把解决问题告诉我)
1 x6 _! I3 Y) z 为了方便,我直接在一开始加上下面这句,忽略掉。
5 g9 w, _5 B. O' S+ D& x; J import warnings1 L* f; i1 ] s, }3 s( `9 e. N* \
warnings.filterwarnings("ignore")
. r% o( D5 ~3 F3 u% K# U+ T
( e7 M0 k+ z$ r! @% H/ Q' Z 要点
1 S5 O: d# W- f, S ( o) h1 u& z1 F( R( |
1旋转图像现成的工具很多,一个是cv2提供的,主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图:7 ?+ n( K0 E- M/ G5 K; J, s) o
9 p7 k( g% ~ ~% L
( o8 y9 D# ]- W# M* U$ D
5 Y/ ?' o N8 h' ~ . q2 N( I2 l) Q0 F. V; A
这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。4 k, q* N7 W# O+ v# V. M
# M& R' F! M; x; {; L1 f
这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图" C9 H: i) k& R7 e g6 H
* J. N5 c1 B9 ?6 T" V* m, ^" M
# @7 D! ~# j) p1 U) B; T; l
* i% O* u2 o7 ~ T3 B
% A: [9 |9 s) l6 K# N l1 ~( M. N 代码 #! /usr/bin/env python
, e6 x. ~6 ~' a3 r+ T& [3 r # -*- coding: utf-8 -*-
* [4 {' O5 ?9 n" c* S # ! python3
5 _4 D# E' Q! F+ o% @: i) P
( {: m2 ]' P5 |/ Z6 {* [5 |, t import cv2/ `% t& f$ q/ g" @
import numpy as np1 ^5 S+ N& v& Z7 i4 ]
from PIL import Image- c) V& k& @8 @
from matplotlib import pyplot as plt. L3 t! n3 ` ~' K8 c
import matplotlib.image as mpimg
, T+ j+ P% b; G
$ [ a( r$ N# J$ [ def rotate_image(url):% `- _8 k9 |! L. b5 E- @
#旋转图像,并将其保存为4种角度的图片
6 T4 _5 f }4 u- @ im = Image.open(url,"r")
: |: n/ b( _' g- o+ Y9 o) e im = im.convert('RGB') #避免有些图报错 4 c4 b, e& w0 G( t. }
im.save('image_test/test_0.jpg') a; N. F$ m. | A
im_90 = im.transpose(Image.ROTATE_90)
) k2 A( q m0 l- U. X% ?, y4 I im_90.save('image_test/test_90.jpg')# y$ L" d; p/ G. N
im_180 = im.transpose(Image.ROTATE_180)
- q8 q& y, m$ ~, h: O im_180.save('image_test/test_180.jpg')
# h5 V" J0 J0 @ b- V im_270 = im.transpose(Image.ROTATE_270)
- o- G6 G* p% `8 r7 y- H* K im_270.save('image_test/test_270.jpg')
$ u: v9 B2 C, `9 I8 G3 ~* n+ q9 t
# R' z$ G& I5 z2 b/ K- s' a def plt_merge_img():+ E {# Y! G3 B) S" X, Q. H3 B
#将保存的四种角度的图片,叠加在同一张画布上
* r1 A4 T: D& Z5 d2 V #使用plt.figure()创建画布,并用add_axes()来分割区域显示图片
9 k( |+ z! W5 z4 ^+ L #显示画布,并将其保存为fig_size.png0 _$ e& z7 Q2 K5 |6 d0 j5 O
img1 = mpimg.imread('image_test/test_0.jpg')
6 F+ v% K& _. b8 G& u, F img2 = mpimg.imread('image_test/test_90.jpg')
4 u1 E: |8 R/ ?# W4 M+ ^$ L) \ img3 = mpimg.imread('image_test/test_180.jpg'): V* v3 ~0 [" m" q7 I
img4 = mpimg.imread('image_test/test_270.jpg') p- _7 x1 G1 t4 _% u
fig = plt.figure(figsize=(60,59),dpi=96)9 t0 R/ p% V7 R3 E
4 y* O k9 M f2 b. }; \; }
#上方的横图
3 [ z5 d' ~6 m4 s" g4 v ax1 = fig.add_axes([0.30,0.55,0.42,0.28]) g0 t K/ _, V- k; t" W
ax1.imshow(img1)
3 X& w$ M \3 ?% `/ t) R( x ax1.axis('off')
) O8 W2 w2 f8 N' { & y7 ?) k; R. c% V1 F% I9 h' ^
# 右方的竖图
/ ?6 S: ]6 h8 } ax4 = fig.add_axes([0.67, 0.29, 0.28, 0.42]): j! J9 N4 [- H% c, l$ x% l: q- ]
ax4.imshow(img4)
$ }) V+ X9 U- W1 u$ E. c' u ax4.axis('off')
- z! A+ S. B3 D
& ?5 [) |. n2 |" U # 下方的横图
$ H8 y# L3 `4 v* Q. t9 y; Y ax3 = fig.add_axes([0.30, 0.18, 0.42, 0.28])8 a# G7 y( {" l- B- N
ax3.imshow(img3)
% L" D& F8 j" k9 U8 i% J& ? } ax3.axis('off')
$ @0 ^2 K- _# T) } 3 I0 o3 [9 u9 ]1 X
#左方的竖图
2 _; e2 k$ A4 b4 ^% v9 q! n ax2 = fig.add_axes([0.07, 0.29, 0.28, 0.42])$ c( Y$ T& f; V- k0 d
ax2.imshow(img2)
) T3 @7 C" y/ z( b2 ^: Q6 H ax2.axis('off')
% C; ?, b) i7 }5 N# f4 y # 保存为sig_size.png: F+ g* r5 ?0 l; d, d. U9 y2 f, U, ^/ }( V
plt.savefig("fig_size.png",dpi=96)
" S" s- F4 }% Q( U plt.show()
( k# P2 a: X3 B
- b- @0 @+ r: [- u. Z def main():: t$ l- P; G( x! p3 Y8 c/ n/ B
url = 'test_1.jpg'
: H6 F$ ` C2 G' c6 _: Y# j rotate_image(url): Z6 { a: ]# Y/ k: t' h/ @5 `
plt_merge_img()6 n6 Z* y: T6 C$ {
% z& \. Z, b% B: y! W" I! J& Z1 ~
if __name__ == '__main__':
4 n0 Y0 Y, J7 t& t# c& P8 s import warnings7 a* k5 V) \ f+ Q/ ?7 x6 n) j
warnings.filterwarnings("ignore")
5 X, ]2 G- t6 d7 Y main()
w+ d, }9 E3 r7 Y4 V1 s) D 7 s+ ^7 l: y* U" E
————————————————
9 E1 q# [' }! W, W- F9 [' a! Z 版权声明:本文为CSDN博主「你要啥自行车」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。: D0 l# W4 o$ s5 O
原文链接:https://blog.csdn.net/weixin_42572826/article/details/1060337098 ]8 I8 \% F+ Y9 y) k/ o
4 w" `# h, e1 o
9 k" ]7 U' E$ d& x a% n9 G$ |
# ~' C& k) ]7 {" [
zan