- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 565560 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174891
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
+ H: r7 D1 Z$ Q: _& P/ `% a
python4次旋转图片后,多图叠加显示2 E, A( V( o% n2 `- J8 O' v: }
[color=rgba(0, 0, 0, 0.74902)]文章目录' F; m' N9 m1 W8 a
- 想要的效果对比,原图VS显示
- 问题
- 要点
- 代码3 D0 v5 P3 z) g8 V6 ?, W/ `2 x
' P y" `7 c; ^
0 B3 ^( b! `5 V4 D. C
[color=rgba(0, 0, 0, 0.74902)]前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog
# n' g" c( `% U4 {( c9 R0 t- V- ]5 t想要的效果对比,原图VS显示
) w6 u. J3 `* M" ?) l2 [
( v6 G; ]9 u9 [) ~( Y. y! h6 o5 J
6 C( D* i/ ]! J问题
) ^' L% |, t! o( K# ^7 T5 N0 I N5 f" f
(1)在刚写出来时,在rotate_image()函数中没有加,im = im.convert(‘RGB’)这句话,就会出现有的图正常,但是有的图报错,无法保存,并显示下面这句话, C3 V7 f4 m, M7 x: T* d
* b# w. k$ k8 ?3 n2 ]) i. o+ `这个问题可以在这一篇blog找到解决方法。就是im.read(url)后,再将图片转换为RGB格式(image.convert(‘RGB’))。这样就可以避免很多因图片导致的问题& P) B1 f9 \2 L, p2 }: x0 f
$ u2 |. k F) u3 h9 [(2)在matlabplot中,显示图的第一步是创建画布,plt.figure(),然后在画布上添加子图,最后显示整个画布的图像时,并且让子图自适应来显示。而我遇到了这个就是关于self.figure.tight_layout()的警告,见下图。
/ a l* |$ Q z* U
: ^7 W( `! L0 o0 a一般在使用plt创建一个画布后,程序本身会有一个自动调整子图尺寸来使用画布的情况,但是因为我是显示图片,所以这个自适应就出问题了。但是还好,只是警告,不是报错,为了方便,忽略就好…(但是我不推荐这种做法,希望有人研究一下,并把解决问题告诉我)
" O5 F+ V8 n- c) R1 L& @6 Q为了方便,我直接在一开始加上下面这句,忽略掉。. O1 p( R& U, {( c4 p
import warnings0 m3 ^4 s X: S+ J7 a
warnings.filterwarnings("ignore")# s( |$ @1 R0 ~+ @
- V, n/ @ C. @& c7 G; n
要点
6 X* l' j# q$ k& q" p5 r; N3 e! d( k
1旋转图像现成的工具很多,一个是cv2提供的,主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图:
% B' p* [+ {% d0 @& ~% \+ K- r$ R$ U, s U2 w
$ E6 t+ J$ _$ C! E: E
2 e. a) j6 a, K
S; ^2 ?7 u; j' |5 B% c P
这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。9 }$ E) N5 g$ r( [% B# z( ?( B
3 O y7 n# {5 U2 M这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图8 g$ K8 f* S/ g& l$ g; @0 u
* P, L( h4 x* D- X) G) z& _+ R; E& H& d) `2 u, M
6 _! h; v& C3 R% p; X. I& {! j( c! v) `$ V, x. p* C1 `8 M2 a
代码#! /usr/bin/env python
4 G* t4 N* V9 ]1 f- k& f* x# -*- coding: utf-8 -*-
( T- N% q9 C4 h- {4 W& `) B p# ! python31 S! d% R, M/ W3 _, Q5 w. \0 f
5 `+ p8 M: }% Vimport cv2
) }& X! k6 E" ?* ~" jimport numpy as np
- y+ |$ L/ T) Y* ofrom PIL import Image
+ z) W5 v( X3 @( w0 T* F# rfrom matplotlib import pyplot as plt/ k) d3 \+ L2 L m7 Z# a
import matplotlib.image as mpimg4 V( X! g- N' o' P; t. O: [
/ O' y& M7 _8 ~: E) P6 G
def rotate_image(url):2 h6 L2 i" ?4 b# R; H8 m7 }( P9 e$ \
#旋转图像,并将其保存为4种角度的图片3 }, P( p4 Q4 k- S0 ^5 q
im = Image.open(url,"r")
1 h& n( c* m# L/ [0 O. m7 `% @" w8 ~ im = im.convert('RGB') #避免有些图报错 - J) s: k8 E- D! p
im.save('image_test/test_0.jpg')% P* a' e9 U$ p2 A
im_90 = im.transpose(Image.ROTATE_90)- m! ^ }+ M$ R- ~* `8 R+ Q
im_90.save('image_test/test_90.jpg') M8 I W, h. U5 r/ F) f
im_180 = im.transpose(Image.ROTATE_180)- z1 _2 O# g/ ?
im_180.save('image_test/test_180.jpg')3 m$ T. c1 b& b8 G6 }# J
im_270 = im.transpose(Image.ROTATE_270)
$ r H# m2 V" u' @: O im_270.save('image_test/test_270.jpg')/ H- n$ }, R1 m c/ [* U5 [' f
3 q, y3 D G; n, Odef plt_merge_img():
5 l5 c6 f& m) w5 i+ w0 u" J #将保存的四种角度的图片,叠加在同一张画布上1 `7 Z* o6 u9 l0 y" }$ [& X6 ]
#使用plt.figure()创建画布,并用add_axes()来分割区域显示图片1 t, L. G d% N m# K
#显示画布,并将其保存为fig_size.png
/ ` O0 s- _8 P% h img1 = mpimg.imread('image_test/test_0.jpg') p4 \% `$ l% |) c2 a! I3 z" I
img2 = mpimg.imread('image_test/test_90.jpg') f6 V7 V4 m* j9 M* @
img3 = mpimg.imread('image_test/test_180.jpg')+ m/ L4 \& K/ M& _$ M+ l) [
img4 = mpimg.imread('image_test/test_270.jpg')" |; }/ v7 p) H
fig = plt.figure(figsize=(60,59),dpi=96)5 j1 y" R& [: h/ ?+ C$ s, q! `+ E0 T
0 `' G1 n j" `" H/ l#上方的横图( A4 z/ R8 @" f- l* w* Q2 H7 ]
ax1 = fig.add_axes([0.30,0.55,0.42,0.28])2 [: U7 W* |: m
ax1.imshow(img1)
8 y, i; S+ d2 ?) q ax1.axis('off')
$ L/ ]4 D* `6 e+ k3 b k
! E$ C$ k/ ~! w! D" j3 A/ S# 右方的竖图2 N; c! o# j2 F/ x; l
ax4 = fig.add_axes([0.67, 0.29, 0.28, 0.42])0 G7 x2 t7 ~- C8 P, y5 e
ax4.imshow(img4)
% o8 s3 s& x# L5 [& l' X1 L ax4.axis('off')
) {) p- ^5 ^2 C' ]- F& q1 w% ^2 W( L1 }# U+ P: u; O6 ^
# 下方的横图
/ b# X. B, T. J! H; i3 x$ L3 \3 i ax3 = fig.add_axes([0.30, 0.18, 0.42, 0.28])
. {1 o) {% q! k1 H! V2 L ax3.imshow(img3)" R7 G( U/ q# E% ~, U: Y6 n$ u
ax3.axis('off'); a) z3 E' R% \+ C2 i
# a9 Q# u: I. Z. M0 e
#左方的竖图2 p8 J+ |3 m; }, J) V
ax2 = fig.add_axes([0.07, 0.29, 0.28, 0.42]) O7 i- d' f- F7 L4 U
ax2.imshow(img2)9 | u" R6 L3 _& o8 f( Z; j
ax2.axis('off')
! _5 [3 r9 J* z# A' _ # 保存为sig_size.png
5 C# e! | [" Z2 S+ s" P, l plt.savefig("fig_size.png",dpi=96)# Q6 c7 T2 x, a* x7 \% Z" c& ~
plt.show()/ g5 i+ n- R3 d x9 L
" @+ p' h1 x7 y6 L0 j, i
def main():3 x0 ~) ]( l2 c! |% V
url = 'test_1.jpg'
# H* T j5 _/ ?5 U rotate_image(url); m$ F; `' {, L, j4 Z4 I5 g
plt_merge_img()8 M6 U8 F" E1 e, U
* ]7 e. x8 p5 ?% wif __name__ == '__main__':; w/ \6 C: E( o5 ]# [8 z
import warnings3 i% k8 V9 H" b+ n# Q0 f
warnings.filterwarnings("ignore")6 _" j5 e# t4 f2 I& w+ O
main()
7 P! Z7 C, ]& G$ l: J; g. Q7 J4 H
8 @2 X1 c' z' X3 L8 Y' I! Q, j# ?% a————————————————3 P* C2 ?2 Z; U- X7 s
版权声明:本文为CSDN博主「你要啥自行车」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
8 m) P) ? `& N" ~# G原文链接:https://blog.csdn.net/weixin_42572826/article/details/106033709
7 i1 B$ m. G! Q; ?1 c1 C. ^8 P F/ \
2 O0 @5 I% q5 J. ?0 X( G$ R
c4 H3 {! T" Z: O. b |
zan
|