- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 565543 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174886
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
6 v$ n3 u3 x1 o8 r$ `5 T( _
python4次旋转图片后,多图叠加显示
* O4 [+ K* x: \7 O/ Y/ n[color=rgba(0, 0, 0, 0.74902)]文章目录/ l! f( g! F" x6 C! i+ ?: L
- 想要的效果对比,原图VS显示
- 问题
- 要点
- 代码3 t5 k" j! E0 S
3 C( {( j6 M+ P' G5 D3 O
4 e9 w; ]. L l! K# F9 t& k
[color=rgba(0, 0, 0, 0.74902)]前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog
5 k% S0 q5 `& f/ B想要的效果对比,原图VS显示
3 b7 Y5 L+ { O/ \' z
) q% | Z$ a0 ~0 v# }; g
: I( Q4 |4 A( q n问题/ V. z% N& { T5 |( }
4 d, k# J; j: g1 x5 @" @! W(1)在刚写出来时,在rotate_image()函数中没有加,im = im.convert(‘RGB’)这句话,就会出现有的图正常,但是有的图报错,无法保存,并显示下面这句话6 ^0 y7 T1 b" C7 K4 v' a& \, e
' {6 a7 N0 h5 `* N# y这个问题可以在这一篇blog找到解决方法。就是im.read(url)后,再将图片转换为RGB格式(image.convert(‘RGB’))。这样就可以避免很多因图片导致的问题* d- c: h: W4 v' \' |) a
( x) V2 b( a" T1 |
(2)在matlabplot中,显示图的第一步是创建画布,plt.figure(),然后在画布上添加子图,最后显示整个画布的图像时,并且让子图自适应来显示。而我遇到了这个就是关于self.figure.tight_layout()的警告,见下图。
# s; |+ c; f. Y: u; C0 O5 [8 f5 x4 E, t' h$ a( U
一般在使用plt创建一个画布后,程序本身会有一个自动调整子图尺寸来使用画布的情况,但是因为我是显示图片,所以这个自适应就出问题了。但是还好,只是警告,不是报错,为了方便,忽略就好…(但是我不推荐这种做法,希望有人研究一下,并把解决问题告诉我)
5 A6 H; D+ H8 M. R7 M e为了方便,我直接在一开始加上下面这句,忽略掉。
' \6 N5 c* C* Wimport warnings
, B, V. F$ `1 ?) lwarnings.filterwarnings("ignore")% ?' N( u* s# G0 Q5 N7 y, z
" X1 {* g: G; A# J1 L( ]
要点
4 t" D* ]9 t, A8 g. }$ } j3 i4 n. x8 N
1旋转图像现成的工具很多,一个是cv2提供的,主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图:! M5 l! `2 P% Y3 L' P
3 l) C% ~( D5 ?& m/ |; {: u6 U
+ G* [; X( b, t% m- ]6 l
& o) u, ^9 l0 M' c
- }3 Q8 k* w `' G这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。
/ B! u7 U" n7 _$ M5 V
# g8 ?( s5 Q! z+ d. p这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图
|8 h+ @; I- O0 I! c! ~! \
' v) J; [$ k8 Z7 l5 D0 `" p: q4 u/ p( d- M" W! L) H% a: D
. f9 L/ {& Y$ s+ b
$ a$ F* d3 }* p$ H# i8 W* O9 {
代码#! /usr/bin/env python, ~7 a! k( N( b' Q2 g
# -*- coding: utf-8 -*-$ `# P) j3 j( O g
# ! python3& G0 q6 X7 J$ w T. e' @
& ~& o0 D- @# ?1 q( yimport cv2
. h# U- ^ T7 T4 q4 bimport numpy as np
0 a4 {/ o2 G) L" k3 d" w# ^from PIL import Image
, T3 i, u0 ~3 i; E% R3 u) I% ofrom matplotlib import pyplot as plt5 M4 j L I# V$ U% R
import matplotlib.image as mpimg$ D: O4 d( c6 t, C+ U+ |( Y
2 {6 j7 K3 O3 Z1 z+ J
def rotate_image(url):
1 O9 |* _7 c8 g2 _5 v* z #旋转图像,并将其保存为4种角度的图片& X% n% k6 z5 H' t
im = Image.open(url,"r")
1 |9 P: L) }+ ]2 {+ q im = im.convert('RGB') #避免有些图报错 , ^8 f; T: J' {! F0 b
im.save('image_test/test_0.jpg')$ q6 G$ j' X1 ^3 G& E* ~
im_90 = im.transpose(Image.ROTATE_90)
. i; `; D% y) b: k% P/ R7 x8 ? im_90.save('image_test/test_90.jpg')
7 v# Y# \. {3 O- l# @7 ^1 ~& ^ im_180 = im.transpose(Image.ROTATE_180)- [5 ^$ b+ @7 [6 q1 @
im_180.save('image_test/test_180.jpg')
8 M9 @, ^, x: h& s* ` im_270 = im.transpose(Image.ROTATE_270)- F! q3 [6 |6 M! Q6 L
im_270.save('image_test/test_270.jpg')9 A* I5 V1 X8 n. s! a( T
# v9 ~, R! J2 {$ ]8 n" N+ \4 l- J1 ~
def plt_merge_img():
9 L7 C7 s: ]. `. t) N; \ #将保存的四种角度的图片,叠加在同一张画布上
2 j C2 B! g+ \! F8 Z$ ^. j7 Z) g #使用plt.figure()创建画布,并用add_axes()来分割区域显示图片$ s! j. U$ \4 o( G. T
#显示画布,并将其保存为fig_size.png, t3 f/ D2 d2 Q5 w% T1 w
img1 = mpimg.imread('image_test/test_0.jpg')
/ Y7 Z7 G# p$ s# U! o& z0 n img2 = mpimg.imread('image_test/test_90.jpg'): z6 w5 v# M3 I3 t3 M$ _
img3 = mpimg.imread('image_test/test_180.jpg')1 P2 q5 d6 y+ A, a
img4 = mpimg.imread('image_test/test_270.jpg')0 m2 x6 s/ y2 a! o b
fig = plt.figure(figsize=(60,59),dpi=96)
' E( ?) n+ N2 X2 Q% H! i
4 j/ j7 E& G+ t& o7 [5 O#上方的横图- V2 X* P4 Q5 a3 z8 o
ax1 = fig.add_axes([0.30,0.55,0.42,0.28]); J; R6 {, E4 a/ @
ax1.imshow(img1)6 G2 d& ]8 u5 x
ax1.axis('off')6 _; Z7 G* u5 y) u
7 W( j$ f9 t$ p1 F5 S3 `# 右方的竖图 m' y. U) x2 W! F6 r! m% o
ax4 = fig.add_axes([0.67, 0.29, 0.28, 0.42])
9 p# C6 n; y5 K- Z ax4.imshow(img4)
' E2 x& Y8 P# ?% y ax4.axis('off'); a/ Q! g# o9 S0 h9 U
. R' N8 n+ l3 q, ? P# 下方的横图2 Y' a4 M4 f% c
ax3 = fig.add_axes([0.30, 0.18, 0.42, 0.28])
2 V. }! s+ |4 l- O8 m ax3.imshow(img3)6 j: V. g) u+ |% q5 r. b
ax3.axis('off'); g& w7 L- M3 p! b! k
8 J L/ b4 ^) c0 L* e#左方的竖图
7 }4 L: V F# C ax2 = fig.add_axes([0.07, 0.29, 0.28, 0.42])# x% M5 }1 i7 I6 \* {3 [' B
ax2.imshow(img2)8 @7 z3 \3 Y3 F1 P& G$ H
ax2.axis('off')
; P; [) K" f7 Q# C, V F # 保存为sig_size.png! a7 m( \2 I( m, d, k6 g
plt.savefig("fig_size.png",dpi=96)+ s" J5 ~: I& B+ h7 H% i. G8 q
plt.show()
) }; b" H! R: j! T; I1 ?% H9 P. W: v) G! `$ Y
def main():1 F( Z) i8 f7 u+ t) O$ J( x
url = 'test_1.jpg'
+ p- z5 S1 O. U3 ]& k rotate_image(url); Q+ a- f' ?: l( r
plt_merge_img()+ z! P& i7 E' j7 ]; M
4 J* K& U: r" hif __name__ == '__main__':
: f7 t$ ]9 S0 S& B import warnings
5 B/ f+ Y2 n+ s% b7 b warnings.filterwarnings("ignore")
! m0 b& M2 ~$ z/ Q2 y# k main()
2 o1 U( o3 Y7 j7 O d
9 ?7 u7 y5 ^* x) x, M% L' h" q& x————————————————9 @" n6 l: X! D( T! Q. M* G
版权声明:本文为CSDN博主「你要啥自行车」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。8 }- B8 u: r" B" P5 ?3 H
原文链接:https://blog.csdn.net/weixin_42572826/article/details/106033709* k+ C: q1 j6 E" r) x8 u$ Z
5 f T: j" J9 L
( O( t! y% s* y: r& v {, ]! Z2 b6 @1 F4 [6 e; z- i
|
zan
|