- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 558766 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 173003
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 18
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
: @/ E! P p+ \( A6 q) V4 |+ {! B4 J
python4次旋转图片后,多图叠加显示
( v2 V6 K1 D0 ]3 Y2 q+ e7 ~[color=rgba(0, 0, 0, 0.74902)]文章目录+ o' y1 y5 }. |2 c* n
- 想要的效果对比,原图VS显示
- 问题
- 要点
- 代码3 ]0 y9 w( B1 Q& G$ Y: B% @8 c
}9 M! Q5 s7 H* e) A( v' d8 h: _4 e7 Y" D( f5 D9 n, H# W- j
[color=rgba(0, 0, 0, 0.74902)]前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog
2 R2 \- V& ?2 C0 u. ?想要的效果对比,原图VS显示
5 }; S. [) u* o- }- W/ Q
% N( I% x7 J P: h' t0 T3 W- n3 Y5 i1 j3 j3 z
问题6 U; {# ]% q& a7 ^- C' a, }5 `
, H; M0 X( I* ~( o
(1)在刚写出来时,在rotate_image()函数中没有加,im = im.convert(‘RGB’)这句话,就会出现有的图正常,但是有的图报错,无法保存,并显示下面这句话& b( s* y; v3 v- H4 H
\. G9 V& V5 y9 p这个问题可以在这一篇blog找到解决方法。就是im.read(url)后,再将图片转换为RGB格式(image.convert(‘RGB’))。这样就可以避免很多因图片导致的问题
8 m7 b3 Y' \( C
3 S7 I: ~5 K6 p! K# _1 K1 [) Z(2)在matlabplot中,显示图的第一步是创建画布,plt.figure(),然后在画布上添加子图,最后显示整个画布的图像时,并且让子图自适应来显示。而我遇到了这个就是关于self.figure.tight_layout()的警告,见下图。
) u8 D/ a9 ? ?. F( Q* Z- T+ i% @7 \/ P( t" h" V7 e) W$ U
一般在使用plt创建一个画布后,程序本身会有一个自动调整子图尺寸来使用画布的情况,但是因为我是显示图片,所以这个自适应就出问题了。但是还好,只是警告,不是报错,为了方便,忽略就好…(但是我不推荐这种做法,希望有人研究一下,并把解决问题告诉我)7 ]& _& U$ r6 ]8 L& ~4 ] s$ G9 G
为了方便,我直接在一开始加上下面这句,忽略掉。
2 s2 Z: p/ J% d: `$ O, f4 c: P2 Qimport warnings0 Q9 f6 m. Z6 b w$ z1 T6 b4 v# ?
warnings.filterwarnings("ignore")
4 X6 R8 q5 B% D0 ^8 ]* h, z
0 \# l* a. {; T1 H( R要点
% f/ s# w4 [/ W; p4 H% d: d8 y9 ~0 L5 v3 T
1旋转图像现成的工具很多,一个是cv2提供的,主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图:
% J1 {# g) d9 B2 V g9 c% H2 n! i7 z5 S& G6 k* {6 ?4 ]
$ T2 g4 J* q! I4 ], g, Y8 S
8 X2 `" s8 m2 h
$ p/ ^% q5 B7 O+ {+ ~8 l这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。
4 ?& P' z/ P8 D1 _: X: n9 D( E& {/ ?! b
这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图% q# Q# v7 i+ S/ v5 q& n! v; H
2 i9 c/ [: V8 a& x0 m6 O5 G* P; a
6 c( p" w! u" D5 W* V
0 m* u1 @8 ~9 H9 a
( M0 f H" E0 p; I9 i: D/ h
代码#! /usr/bin/env python. O H- ` _1 n$ }* p: {5 p
# -*- coding: utf-8 -*-
4 w* T% _' G* o- \. z) r# ! python3
* X; ]8 Z& Z: p X# T
, G( l" ?) R5 H4 ]2 pimport cv2( p7 G$ f Q u( x! K3 ]8 r- t( n
import numpy as np
' p! p' o+ e6 Y3 Wfrom PIL import Image, Y7 e' L8 s/ s5 V/ ~
from matplotlib import pyplot as plt
' x4 @ q/ c; y, ?import matplotlib.image as mpimg' r" k/ \1 H5 Z
% _$ D. \$ C, y9 wdef rotate_image(url):
1 f5 e! S0 [4 E, K #旋转图像,并将其保存为4种角度的图片7 F8 [) Q' E E7 ?5 e0 D9 p$ E5 v3 Y
im = Image.open(url,"r")
# J& B8 G2 a2 F( { im = im.convert('RGB') #避免有些图报错
7 g' ]( @4 B% L1 p1 W) b" o im.save('image_test/test_0.jpg')1 ]% U3 K2 [ v3 w( J8 f
im_90 = im.transpose(Image.ROTATE_90)
! |# u1 d0 N/ R" j/ b im_90.save('image_test/test_90.jpg')
& |0 `. ` |" {" ?. ]! j; ]0 W Z im_180 = im.transpose(Image.ROTATE_180)6 h% h' | q" _2 q; N
im_180.save('image_test/test_180.jpg')
4 A1 _. o. D% t5 y. {* j R im_270 = im.transpose(Image.ROTATE_270)7 o& k- V! R" ^$ S4 y
im_270.save('image_test/test_270.jpg')) R2 @, m9 o' A( R9 A) A
+ J i1 J) i$ W. |; ?" _* i8 L6 qdef plt_merge_img():7 Y2 h. w$ X6 `0 S
#将保存的四种角度的图片,叠加在同一张画布上1 \& K8 F+ a2 t5 l
#使用plt.figure()创建画布,并用add_axes()来分割区域显示图片
% R9 v) P, A7 y, D+ S- D. B5 q #显示画布,并将其保存为fig_size.png
& S& M" d/ ~9 T$ T img1 = mpimg.imread('image_test/test_0.jpg')& D- _0 X6 Z" i! A# E. t
img2 = mpimg.imread('image_test/test_90.jpg')6 o: u r$ [/ s7 b
img3 = mpimg.imread('image_test/test_180.jpg')# `* Q* U( Y6 l6 @. [# U9 y S0 j; w
img4 = mpimg.imread('image_test/test_270.jpg')
% W G+ W4 k" s+ K' E) |% n fig = plt.figure(figsize=(60,59),dpi=96)
8 A/ p. ]& S5 |2 [& R( c
" ` W; O4 Q: v8 z#上方的横图
! Q- x7 S* E6 j+ l1 C1 `! ]) }+ V- a ax1 = fig.add_axes([0.30,0.55,0.42,0.28]) ^; i: }1 R' x& K. t
ax1.imshow(img1)
7 B/ W7 y0 ?- K0 S+ L2 j/ U ax1.axis('off')2 ~! R& E# F# P: l1 d% }
; ~6 K2 l) j; v. [. y6 Y& y% `# 右方的竖图
5 s( m5 c! E$ d% p1 O7 ^/ R ax4 = fig.add_axes([0.67, 0.29, 0.28, 0.42]); J5 t2 W- X, R( }9 H, ~
ax4.imshow(img4)# x% i6 h9 e: _# M8 Z
ax4.axis('off')
# n9 ^# C6 U ?0 ]( K: e
0 k% J; @0 C6 G0 K# 下方的横图
e3 o5 t/ M' `& @% ]/ V& r% G ax3 = fig.add_axes([0.30, 0.18, 0.42, 0.28])# ^# r9 a# {& K7 N
ax3.imshow(img3)
& `1 J; B; R) p5 t/ i: l3 ^9 i ax3.axis('off')8 h [' b Q- A2 u) H
. T# F- B- C1 j; ?0 b
#左方的竖图
* ]% ?0 H5 |4 i" R3 G" V ax2 = fig.add_axes([0.07, 0.29, 0.28, 0.42])
% D1 {$ K( z" T& w" W6 X ax2.imshow(img2)) b6 w& m6 L$ l8 W; n; y3 S
ax2.axis('off')
0 |% P/ j ` {- f # 保存为sig_size.png
/ z4 @7 j: H# R2 x- _$ u- E/ j plt.savefig("fig_size.png",dpi=96)
6 a8 C9 ]1 Q3 j( ~$ p plt.show()
: ^- s; @4 L' p. g4 @+ S$ W$ N4 i; e( @
def main():
3 L7 e2 ]" H( b5 ] url = 'test_1.jpg'2 K. T" l& W1 m7 p1 |& E/ \
rotate_image(url)
( g0 N" p% f1 i: ` plt_merge_img()
, O3 c* s o4 W. ~
* R. h/ R E7 vif __name__ == '__main__':+ v( E4 w. }! z4 g
import warnings
" Q: m( i1 v; Y1 v. b; \ warnings.filterwarnings("ignore")' m& S0 S2 @4 Q: M4 j
main()( {8 w( l# u$ B( G
1 w3 j! u; O0 D$ }, ~+ @: x————————————————. i, Q! R$ ?! ^8 ^ A; U
版权声明:本文为CSDN博主「你要啥自行车」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
- }; E) d- t( A原文链接:https://blog.csdn.net/weixin_42572826/article/details/106033709
7 \4 D8 g% l, W7 m6 c" f9 q
8 |- @3 l7 X! k% ?) w$ s2 G1 @ \1 j+ q }8 g9 m
& t4 |/ z7 |! z7 Y- T |
zan
|