在线时间 1630 小时 最后登录 2024-1-29 注册时间 2017-5-16 听众数 82 收听数 1 能力 120 分 体力 563423 点 威望 12 点 阅读权限 255 积分 174250 相册 1 日志 0 记录 0 帖子 5313 主题 5273 精华 3 分享 0 好友 163
TA的每日心情 开心 2021-8-11 17:59
签到天数: 17 天
[LV.4]偶尔看看III
网络挑战赛参赛者
网络挑战赛参赛者
自我介绍 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
群组 : 2018美赛大象算法课程
群组 : 2018美赛护航培训课程
群组 : 2019年 数学中国站长建
群组 : 2019年数据分析师课程
群组 : 2018年大象老师国赛优
) o- x4 S7 i, z3 [ python4次旋转图片后,多图叠加显示 ; U, |# j* M+ Q- N4 Z& @# a" E
[color=rgba(0, 0, 0, 0.74902)]文章目录 # V: v( w9 w1 R- }$ k& e7 @8 Z4 r
想要的效果对比,原图VS显示 问题 要点 代码 2 k, Q5 f ~7 Q# v
- \# G. W, C* Z) x' i3 T/ r
" j6 u* [: a" Y+ @6 O
[color=rgba(0, 0, 0, 0.74902)]前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog ' b5 B9 l7 K( _+ E3 A9 M! r
想要的效果对比,原图VS显示
: t2 Y+ E1 V# c( Z. T& @
* g: I' V% E K7 K& u: l3 y ]* x; p
2 L: @9 w5 p; v# D: @ 问题% v. K1 u& m3 t* t5 b: w
" M6 T+ O9 v2 z+ b" Z (1)在刚写出来时,在rotate_image()函数中没有加,im = im.convert(‘RGB’)这句话,就会出现有的图正常,但是有的图报错,无法保存,并显示下面这句话
* e# b( o- o" a ` 0 e3 A* R, f' j" a8 A4 S# O! r O
这个问题可以在这一篇blog找到解决方法。就是im.read(url)后,再将图片转换为RGB格式(image.convert(‘RGB’))。这样就可以避免很多因图片导致的问题, m7 U' p) M2 |+ G( P- O
) ]+ l% T9 V8 M3 c2 z (2)在matlabplot中,显示图的第一步是创建画布,plt.figure(),然后在画布上添加子图,最后显示整个画布的图像时,并且让子图自适应来显示。而我遇到了这个就是关于self.figure.tight_layout()的警告,见下图。. f( O' D7 k+ D0 J, _2 A1 X7 r
/ R K D+ a: B' ]1 } 一般在使用plt创建一个画布后,程序本身会有一个自动调整子图尺寸来使用画布的情况,但是因为我是显示图片,所以这个自适应就出问题了。但是还好,只是警告,不是报错,为了方便,忽略就好…(但是我不推荐这种做法,希望有人研究一下,并把解决问题告诉我)
8 b+ ^" K: ]5 s M. I 为了方便,我直接在一开始加上下面这句,忽略掉。* P( h& f8 s+ ]
import warnings- U1 Z; u8 d8 e3 x a4 S
warnings.filterwarnings("ignore")' u* U% e) \0 u) C: Y0 o, i; s
O) \4 u9 y7 d5 K3 n
要点
x9 w# \; P9 J/ G9 y; r8 G7 X6 ^- b
# l" C# w A% t. V. A 1旋转图像现成的工具很多,一个是cv2提供的,主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图:2 q9 K* P: B }+ q" }
5 Q/ Q+ I- r2 e8 V/ N3 Y5 g
% }/ H- n! w; A, ~+ q2 `( l. v
) T6 U% D7 E: ~8 |6 z: j& V' d
2 S& R( N9 `/ M' }: }/ Z# ^ 这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。+ c) W# a* |0 N9 Z
6 s: v/ H+ k! h) J# Q, y 这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图
8 B' n' w; b$ Q) w5 X & z: E% s- b$ l4 b6 Q, X& v
/ J: u7 V. y: e. x# x
0 k3 \* @ G# { 0 Q9 J6 s# |. {' l
代码 #! /usr/bin/env python
3 E0 i$ O, _" m' m. W0 K # -*- coding: utf-8 -*-
' y; J" n f( h' `/ }0 w. o # ! python3
( L- m; R1 ~2 w1 D 8 N1 B, e+ q5 X/ H9 m1 U
import cv2& J& Z4 x1 X$ `3 H) y- k9 c, [
import numpy as np, u* Q5 M9 `8 F0 N0 D Q4 ?
from PIL import Image
1 `2 j2 W0 m; W0 Q# E from matplotlib import pyplot as plt: t1 E/ i- q. Q* d, A
import matplotlib.image as mpimg
- F4 L. {' i ~3 K( z
! B6 p2 c. q- x* Z" q def rotate_image(url):" g v% [( ^ k$ [( b
#旋转图像,并将其保存为4种角度的图片
* |1 M5 f g9 ]1 @5 W0 q5 ` im = Image.open(url,"r")
; {' [5 u" ?* E: K+ Y2 W) N8 a im = im.convert('RGB') #避免有些图报错
' z/ P' P2 M+ z% I im.save('image_test/test_0.jpg')
& {6 `) ], j7 m' f im_90 = im.transpose(Image.ROTATE_90); j. c- T3 I) k B
im_90.save('image_test/test_90.jpg')1 H- T- y8 V2 P' u* r
im_180 = im.transpose(Image.ROTATE_180)0 r6 T$ ?! b# E& k+ S2 }7 D! i; P
im_180.save('image_test/test_180.jpg')
6 ]" @% n+ T3 l" {" A# | im_270 = im.transpose(Image.ROTATE_270)
4 i7 u. D4 O% b6 h$ H2 `; a im_270.save('image_test/test_270.jpg') ]! O/ N9 A' U& ^4 y0 C `
: i& W! m" w% ?% U0 H$ S( X
def plt_merge_img():
2 [9 f1 I! p8 E+ V1 x1 I #将保存的四种角度的图片,叠加在同一张画布上7 ]1 s7 q7 \+ y0 A# |: V& v
#使用plt.figure()创建画布,并用add_axes()来分割区域显示图片
$ |& K3 E! z0 Q% { #显示画布,并将其保存为fig_size.png
. b+ {, P; x9 q! M. J img1 = mpimg.imread('image_test/test_0.jpg')* y l$ O! f; H* B
img2 = mpimg.imread('image_test/test_90.jpg')
) n+ r3 @& i: u7 \* b ` img3 = mpimg.imread('image_test/test_180.jpg')( n9 [, E6 U5 q, n" B& }
img4 = mpimg.imread('image_test/test_270.jpg')
) Z8 X) o, a$ Q7 ~ fig = plt.figure(figsize=(60,59),dpi=96)% d% S- ?" L: {5 M0 [
# s! \# Y0 i- ]% g$ i( f0 m #上方的横图
" d3 F/ g" T8 o; ^/ v2 j% [/ M ax1 = fig.add_axes([0.30,0.55,0.42,0.28])
( ^ Y# |) x( K, {" \- ` ax1.imshow(img1)
& J0 ~& B- p% e# p ax1.axis('off')
0 w7 J$ u' _( Z& ]/ W
; f& E' n+ ~. M8 D: c: g# g& A # 右方的竖图
3 E+ ^0 W& Q2 f/ `" r! i ax4 = fig.add_axes([0.67, 0.29, 0.28, 0.42])
$ m( g8 e B: a& y% P' L, V ax4.imshow(img4)
( i/ o/ \, B( [4 d. W2 ` ax4.axis('off'); a' A! l3 z/ r3 \. L2 v8 k
% A( y8 [% J2 d8 u2 u
# 下方的横图. J6 H6 {' l/ _
ax3 = fig.add_axes([0.30, 0.18, 0.42, 0.28])
5 N, e' B5 x/ C0 Q9 i3 }+ N2 i ax3.imshow(img3)
' A: I" y( I( W0 ]& `' a1 k% G9 i ax3.axis('off')
% Q$ o" W/ i. v5 k! ^3 Z( j
1 E4 f; g3 G5 Y4 b #左方的竖图$ s3 g2 u. ~6 z1 D
ax2 = fig.add_axes([0.07, 0.29, 0.28, 0.42])
+ E$ n( F T: X2 r0 K ax2.imshow(img2)0 E, g) w. m0 T. P5 a9 [, {
ax2.axis('off')
7 f$ r7 J0 t$ s8 n! u; U& X # 保存为sig_size.png. T- D; I9 a4 E0 r5 V1 J
plt.savefig("fig_size.png",dpi=96)
, J1 R/ K, e- G$ E% T4 g4 r9 R( u plt.show()6 x; `# F3 f4 N+ z5 c2 R) q
2 J: d, c% H; [6 h
def main():: M4 o [8 ~' x" V. |
url = 'test_1.jpg'/ T" o4 [ l2 w% I4 ^
rotate_image(url)* k+ z- C2 h. {6 g* m: e
plt_merge_img()
2 \7 E `5 i2 l; R8 w( A0 C # g) G( W% B# }" J5 V
if __name__ == '__main__':
- ~. I' w/ t6 S+ i# v' j0 q" r import warnings! y% Y$ K0 H; q. s0 j; N; q
warnings.filterwarnings("ignore"). R" b% W j% r: ^9 B
main()5 t+ V8 G N' o
, V# M8 f, v, o2 d" Z ————————————————
, U2 @! R) {# m+ j* z" S& r1 x9 R4 C 版权声明:本文为CSDN博主「你要啥自行车」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
/ I1 w4 Q' V, o Q7 c, w8 P- R 原文链接:https://blog.csdn.net/weixin_42572826/article/details/106033709* L! j/ y5 ` I `
7 X( y" h- m) m% H) } g% H$ I4 R. P- ~2 Y% W
; X$ K% E: w2 I
zan