- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 558559 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 172941
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 18
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
3 z. k' I; ?8 M- G; n8 l
python4次旋转图片后,多图叠加显示
1 m* p, `! b' m5 e! |$ r8 A9 w. p[color=rgba(0, 0, 0, 0.74902)]文章目录" P5 l3 n* J! L# r; m& L! A
- 想要的效果对比,原图VS显示
- 问题
- 要点
- 代码) u/ m0 J1 ^ V* D2 G! G
) f& G/ F" z5 ~
, m5 j F3 S# @, J4 ][color=rgba(0, 0, 0, 0.74902)]前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog
" T( m. F( a8 U' b4 v8 l+ k% P想要的效果对比,原图VS显示
7 \7 \3 e; l, g) q/ @8 x$ V% N
1 m' \% Z* _" V问题; k9 a+ r) q( t l% _, \$ X" Q, S
: Y. T+ y3 L( P' Q(1)在刚写出来时,在rotate_image()函数中没有加,im = im.convert(‘RGB’)这句话,就会出现有的图正常,但是有的图报错,无法保存,并显示下面这句话
7 _& r9 J, Q2 T5 O8 O& C0 R- D. w; y: w: y9 n/ b5 `
这个问题可以在这一篇blog找到解决方法。就是im.read(url)后,再将图片转换为RGB格式(image.convert(‘RGB’))。这样就可以避免很多因图片导致的问题
: _4 j6 l6 F, B% Q0 R+ J7 t
# Q5 A; H4 C- X- t0 b(2)在matlabplot中,显示图的第一步是创建画布,plt.figure(),然后在画布上添加子图,最后显示整个画布的图像时,并且让子图自适应来显示。而我遇到了这个就是关于self.figure.tight_layout()的警告,见下图。4 a2 c3 I) o3 g2 m$ A3 ^! P
0 u; C7 l1 d+ m. }2 S1 l/ d
一般在使用plt创建一个画布后,程序本身会有一个自动调整子图尺寸来使用画布的情况,但是因为我是显示图片,所以这个自适应就出问题了。但是还好,只是警告,不是报错,为了方便,忽略就好…(但是我不推荐这种做法,希望有人研究一下,并把解决问题告诉我)' A+ U; s, X& @! ?# x
为了方便,我直接在一开始加上下面这句,忽略掉。
3 z# l+ a2 t9 ]/ S6 oimport warnings. Q) h2 U- h' h$ Q
warnings.filterwarnings("ignore")
& J- q& t) B o% S/ A: P! Y$ H, m- L
! j2 G0 |0 K) g/ @4 N' p z要点
, c) w! I/ n5 o! Q: w- k6 b5 I/ I
& }7 M9 s- s0 H7 q' n- w1旋转图像现成的工具很多,一个是cv2提供的,主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图:6 W5 W# L, U. i( g" X( `$ [
; w7 I/ Q0 C/ D$ I% v
5 g6 @" @# Q" ~) \7 ?! I
+ G- | N& {1 k6 p( \- O
" m5 N+ j( a, V0 {0 t; \* m
这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。
+ ^8 r' i' [* b. M3 W+ u
1 e2 f9 h* d+ p, v这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图. S* X- \, P$ o6 ?2 `/ m. y
/ s) O9 f5 f' }+ a7 j4 |
9 x8 M/ p& a# `" W+ U, e& S
! d" `$ \; c: ]/ B
7 F& f: H3 y O0 l" E1 l; N代码#! /usr/bin/env python
; U4 Z/ Z' ]0 x& g* |0 s# -*- coding: utf-8 -*- Z, c3 T# U3 W% m# o
# ! python35 ^% m" H, m7 s. M: f: N% f
1 q& N# ], z/ m( o) m. K0 O1 J8 Yimport cv2
% I6 _5 i0 e8 g' F* I4 Pimport numpy as np
2 f9 d) m6 L7 S7 tfrom PIL import Image' B `% Q6 N5 F" ~6 j- c1 l, g; ^
from matplotlib import pyplot as plt
: u8 V6 b/ N1 bimport matplotlib.image as mpimg: d0 t3 G( B5 D R6 M( I4 g
' ]' a: |7 F3 m2 F) Z7 l
def rotate_image(url):8 l& _# L/ O( K- W
#旋转图像,并将其保存为4种角度的图片
0 }1 x' z3 E4 k& g( \ im = Image.open(url,"r")
4 g' u4 k, _5 O% d im = im.convert('RGB') #避免有些图报错 # W8 Y+ ^ i1 I% B
im.save('image_test/test_0.jpg'), h3 A% w. d4 H
im_90 = im.transpose(Image.ROTATE_90)# {9 k( Z' s- u1 s2 [4 R1 F
im_90.save('image_test/test_90.jpg')( H% m+ y3 T2 o6 X$ v* l
im_180 = im.transpose(Image.ROTATE_180)
$ `+ k' E# { b; j' O im_180.save('image_test/test_180.jpg')6 m# V: T% T. e" c
im_270 = im.transpose(Image.ROTATE_270)
3 T; ~. Z, |9 ~, F! B im_270.save('image_test/test_270.jpg'); l( `; I. t Y9 }* ?
! @3 L$ f8 v/ a% y7 k
def plt_merge_img():
0 K" I% x0 j: Z) `! b9 Z #将保存的四种角度的图片,叠加在同一张画布上7 \; F0 ?0 f7 W! M/ Q4 Z% \
#使用plt.figure()创建画布,并用add_axes()来分割区域显示图片
+ W4 m* S% D/ H9 H #显示画布,并将其保存为fig_size.png8 _. W$ D9 P5 j+ J
img1 = mpimg.imread('image_test/test_0.jpg'): Z7 w1 D. p5 w" \: j. N( k g
img2 = mpimg.imread('image_test/test_90.jpg')" K2 V7 W% W3 C$ ~
img3 = mpimg.imread('image_test/test_180.jpg')
& ?, o5 w) D O$ G$ f img4 = mpimg.imread('image_test/test_270.jpg')
- |# n/ S% }7 @' z- p fig = plt.figure(figsize=(60,59),dpi=96)
, `7 K6 V! q) ~3 E- U6 w% A; I
: Y7 A4 Q, y4 l- ]2 ~#上方的横图/ U N* T+ J( d$ P3 S6 g* y! ^
ax1 = fig.add_axes([0.30,0.55,0.42,0.28])
+ i( v. H, @+ O! D. d$ g ax1.imshow(img1)/ t! I- K* t& C8 M
ax1.axis('off')
. O! O" d4 o# c6 k3 Q8 x$ ^8 O3 ?: u1 Q5 Y) @2 y2 f
# 右方的竖图
5 h) _. L# t& O6 f ax4 = fig.add_axes([0.67, 0.29, 0.28, 0.42])( M2 `+ K q( c6 L
ax4.imshow(img4)
# c/ g/ N6 Q/ ]. r9 {9 q ax4.axis('off')
; P9 y( p9 t5 c% n' [" M3 w3 Y3 ^0 F2 {$ {; N
# 下方的横图2 _2 x0 i7 [, ]/ J
ax3 = fig.add_axes([0.30, 0.18, 0.42, 0.28])
/ P; L, D& B/ t" e% H ax3.imshow(img3)
( T3 T* y' A+ l0 ] ax3.axis('off'), _* G( f+ J$ M
9 S% C( a; N& H. n& q- V, D; o
#左方的竖图' x6 g$ b( m6 E
ax2 = fig.add_axes([0.07, 0.29, 0.28, 0.42])6 q) r9 d* o" R, H- C) ?" p" s
ax2.imshow(img2)) Q$ U, d* E& P0 q
ax2.axis('off')
: f. v7 w) q" R, |- z0 N& T8 c. \ # 保存为sig_size.png
' B# `2 M9 N1 @7 c7 U, K plt.savefig("fig_size.png",dpi=96)2 J; }4 d; C1 E
plt.show(). y2 H, t: z2 `
# C i- r# \9 Q+ F* idef main():& ]9 g' n, e! J
url = 'test_1.jpg'0 H9 N% M# c- Z' ?
rotate_image(url)
- }9 g& @0 a9 F8 T" i plt_merge_img()- W$ x9 }6 J. s9 p0 p7 i
9 }' b) X* G. |& `9 Q
if __name__ == '__main__':1 Z0 j0 k' \) Z! i2 E1 H0 \# q0 u2 y
import warnings" Y9 g$ W( e( i$ Q
warnings.filterwarnings("ignore")
* L0 l6 q8 R$ w+ B; w main()
( E0 P& B5 \5 w& p K& ]4 e4 B# h4 Y. v/ S2 ^0 Z4 g
————————————————
. g3 E7 \% \0 d* t, s0 m版权声明:本文为CSDN博主「你要啥自行车」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
2 N* f3 i8 Z' T+ O0 Q2 Y( I原文链接:https://blog.csdn.net/weixin_42572826/article/details/106033709( p# h" @* Q( U" D- ~' ?( e
: m, k* s2 `7 R$ v( W+ o8 g$ ?8 ` U: e& |0 I9 d
% Q( Z3 C. G" o |
zan
|