- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563427 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174251
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
% b/ \0 C' G0 _8 t$ B6 t. p
python4次旋转图片后,多图叠加显示
) p9 x! v: C7 ^3 l4 k$ `7 r[color=rgba(0, 0, 0, 0.74902)]文章目录( j) }& U; Y5 {/ z9 m
- 想要的效果对比,原图VS显示
- 问题
- 要点
- 代码
6 g6 `. F2 J$ w
& T+ V& P, q2 @ U: p* N4 z" \# U
" P1 d( k3 @6 l0 D8 _( R[color=rgba(0, 0, 0, 0.74902)]前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog
# p$ ~( J( I2 t y想要的效果对比,原图VS显示
8 S, e1 w; L/ S" h5 y
5 V5 w8 c; T. |1 \7 W
Q% d0 R3 L9 K- z( w问题
" G6 z) g" W. }# z9 \6 s
" i: u# }0 w9 M0 `3 W& {% Z: b% F(1)在刚写出来时,在rotate_image()函数中没有加,im = im.convert(‘RGB’)这句话,就会出现有的图正常,但是有的图报错,无法保存,并显示下面这句话' j, x3 f6 C# o7 ^ |9 o( F
( ~2 c+ U4 Z4 f# s( K
这个问题可以在这一篇blog找到解决方法。就是im.read(url)后,再将图片转换为RGB格式(image.convert(‘RGB’))。这样就可以避免很多因图片导致的问题5 K8 Q! X2 r l0 n
& x; B* {9 p4 v6 ^) A% n$ M: x
(2)在matlabplot中,显示图的第一步是创建画布,plt.figure(),然后在画布上添加子图,最后显示整个画布的图像时,并且让子图自适应来显示。而我遇到了这个就是关于self.figure.tight_layout()的警告,见下图。( g; s; n; @% N9 `: O% i& J
$ t4 E# D) A1 f4 c. k! _* |0 o( i
一般在使用plt创建一个画布后,程序本身会有一个自动调整子图尺寸来使用画布的情况,但是因为我是显示图片,所以这个自适应就出问题了。但是还好,只是警告,不是报错,为了方便,忽略就好…(但是我不推荐这种做法,希望有人研究一下,并把解决问题告诉我)
( P. A- b- b# B; H为了方便,我直接在一开始加上下面这句,忽略掉。
: z. g0 U8 y1 b6 E# @import warnings$ d# e. V1 U+ T. v
warnings.filterwarnings("ignore")
' i* z5 w* z$ n5 Q& r8 M2 _
/ w; s l, T& G) E' t要点7 k0 e/ g) n$ E6 N$ Z5 Z3 l
* M7 u9 E0 ~4 v
1旋转图像现成的工具很多,一个是cv2提供的,主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图:
/ G& ^/ n# F2 g% E) f, ~$ U+ N9 D% ~ n3 R% N5 ^. k/ q
z2 n! V9 ^8 L v5 @
" g% B- P' Q5 b, U9 _. m$ w9 w. i/ G" {/ N6 o
这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。: D5 K/ q: y1 J0 ]9 \
% O/ W( v: j& R: G+ u2 L, a
这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图
* H: @. c) z5 p% ^) C; ]; o
" v- B/ x5 m _/ u, s* R0 p
& y& M, Y# z9 X# w5 ]
7 R6 k8 R3 k( j ~- Y& N
9 c( N7 K9 e, y- r- M& O1 ~4 t" V
代码#! /usr/bin/env python
& \! U, i' S/ C1 \8 X# -*- coding: utf-8 -*-
1 V) T1 L9 m5 Y* ]5 l( c+ B- p6 ?# ! python3. _+ a) o, J; x) V, g, I/ s
% H) r4 {5 l3 d+ _( W5 o
import cv29 R+ Z' i9 [0 a$ ?' h+ P* [2 b
import numpy as np
7 v& f! N: {1 ]( m- Qfrom PIL import Image
: j1 n+ r, \9 p; A; o# _7 m/ R3 Hfrom matplotlib import pyplot as plt
% a/ h) Z9 V8 M- M! x. Aimport matplotlib.image as mpimg% ?) i6 l4 O& p2 Y! @( i
+ o9 i: j; O& \1 Z/ w* u3 L- {def rotate_image(url):, ^5 ~/ u6 K6 A0 t- u) e, r9 S" T
#旋转图像,并将其保存为4种角度的图片/ s" i3 _/ {4 F% B) C
im = Image.open(url,"r") e. T P" y1 Q
im = im.convert('RGB') #避免有些图报错
) ~: w! y5 T' t" }/ @5 H) ^ y im.save('image_test/test_0.jpg')
# }3 H8 h! U/ l8 {& R im_90 = im.transpose(Image.ROTATE_90)
2 X& B, U! t7 _% \ A/ `; c im_90.save('image_test/test_90.jpg')
/ c- a4 _- u4 g im_180 = im.transpose(Image.ROTATE_180) V! k$ Y% R$ ^
im_180.save('image_test/test_180.jpg')2 i7 D8 g+ _! `# ~
im_270 = im.transpose(Image.ROTATE_270)+ j& z% _3 ]5 @, `4 w" ?0 e. x
im_270.save('image_test/test_270.jpg')) }: F/ Q" `( }$ h7 j
, B! m6 ?. `5 p8 }% W8 K8 mdef plt_merge_img():
3 F& {) ~; Z; x4 [! u3 ~, G2 L #将保存的四种角度的图片,叠加在同一张画布上8 z+ l; t9 i. K5 x8 l8 G+ Z. [ d2 @1 J
#使用plt.figure()创建画布,并用add_axes()来分割区域显示图片
! @; B0 W E4 K4 S' Q; Y #显示画布,并将其保存为fig_size.png4 C" v8 K) H% r/ {# b9 e
img1 = mpimg.imread('image_test/test_0.jpg')* w) \( n6 H7 C2 f: i7 d
img2 = mpimg.imread('image_test/test_90.jpg')0 m) w3 W2 ^( u0 |2 Q
img3 = mpimg.imread('image_test/test_180.jpg')$ w1 o4 T! D) r7 {
img4 = mpimg.imread('image_test/test_270.jpg')! V7 ~' \$ c1 C% K9 T" k2 q; I
fig = plt.figure(figsize=(60,59),dpi=96) L0 i+ P8 [4 Z8 M x7 U
( q: Q: e2 z( Q6 Q
#上方的横图+ _/ r0 U q3 a- s
ax1 = fig.add_axes([0.30,0.55,0.42,0.28])
, O) l, A" G" G' N ax1.imshow(img1)
r; c& s+ T7 h ax1.axis('off')8 k; D7 K' f7 w+ `* K
- r. i0 l) H$ m/ ? W5 | V& V6 n2 m# 右方的竖图, U3 Q |& r; p& R
ax4 = fig.add_axes([0.67, 0.29, 0.28, 0.42])
* P( Q! h" B! ]: | ax4.imshow(img4)9 E3 R+ \9 C- {& f/ p# A; t
ax4.axis('off')
6 ?6 e5 N/ K& }. E9 D% V
% f- n7 A9 N1 o( l0 Z# 下方的横图
+ \) {* r* l4 J1 A# ~) O, X+ U ax3 = fig.add_axes([0.30, 0.18, 0.42, 0.28]): R c$ ~# C* d3 h# r
ax3.imshow(img3)' U! I, H4 G6 A% l9 r
ax3.axis('off')& Y0 X; ] A: T/ R
: W+ T; F6 t3 Q- [9 U6 X* n7 X#左方的竖图 p/ Z# {* e" r2 g1 d5 U
ax2 = fig.add_axes([0.07, 0.29, 0.28, 0.42])
2 F4 T' O- n( n7 I ax2.imshow(img2)- X6 m7 g7 y% ? Y) u6 |1 ]+ ?6 z
ax2.axis('off')
# Q# d( N# t T# g; P3 `) | # 保存为sig_size.png
8 [9 ^( P+ N9 I. M8 T$ l8 k plt.savefig("fig_size.png",dpi=96)/ j+ i- X! o7 N' p
plt.show()# E' S: Q- ?1 r. @* L T
# P! S) \6 N s, kdef main():) Y3 V7 ]3 G/ D v
url = 'test_1.jpg'
6 ?! y6 g0 R' L5 D! y rotate_image(url)
' k) G6 b+ ~8 D, M plt_merge_img()
% X& {! d$ h7 s0 R4 }/ ^3 Q" a9 @; p2 q# x
if __name__ == '__main__':
5 t2 M; ~: u, o0 i% x' w$ U import warnings
* u$ a; z5 ?/ O% }, x# \4 p! O* A1 O7 w' q warnings.filterwarnings("ignore")* d, D6 Q- E4 Q" ]/ e a
main()6 C$ K1 F# Z+ p
( v( w& g) k/ t' U# ~1 ~
————————————————6 D, |# c$ a- X1 N. F. p5 T$ E5 M5 N
版权声明:本文为CSDN博主「你要啥自行车」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
1 `- D) e9 G7 t- X d原文链接:https://blog.csdn.net/weixin_42572826/article/details/106033709
/ T) e) w" B; U, e3 ]7 C/ O
7 w* h& v; s/ q( L- r0 ~9 H2 ?7 ^
7 I/ R" w3 j O, [; ^6 d# z* m) C( y. x/ o2 S5 e9 y! O8 U9 o
|
zan
|