- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 566742 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 175245
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
& p( _) Q& j+ ?8 }4 R9 ~" ]" W
python4次旋转图片后,多图叠加显示# _/ _6 J4 V2 j8 R& Z( N5 c
[color=rgba(0, 0, 0, 0.74902)]文章目录
) ?" ^! h% d: A% ]% y- 想要的效果对比,原图VS显示
- 问题
- 要点
- 代码& E- a. J. I! h$ K. }# V
/ k4 N# E* N* q" d r. Y6 c4 H2 z4 ^# W1 ]' h2 l; M
[color=rgba(0, 0, 0, 0.74902)]前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog, _8 O0 E# n& E% r3 s
想要的效果对比,原图VS显示
8 [9 J( _% w, j" ]" @. x% X
- g& E4 c! |. \9 P
4 C' w* ^" r# S8 a+ p' J4 d问题
" j, c! a2 Y: G# Y0 N/ W% `, S( O" ^* _, B
(1)在刚写出来时,在rotate_image()函数中没有加,im = im.convert(‘RGB’)这句话,就会出现有的图正常,但是有的图报错,无法保存,并显示下面这句话
1 @4 v4 j3 T# I4 n
( y3 O6 s9 B2 s0 C) S- l0 o; L这个问题可以在这一篇blog找到解决方法。就是im.read(url)后,再将图片转换为RGB格式(image.convert(‘RGB’))。这样就可以避免很多因图片导致的问题
. [% P* C8 p. U: e3 w* X0 \) V8 }, b6 ]( ]6 Q9 y
(2)在matlabplot中,显示图的第一步是创建画布,plt.figure(),然后在画布上添加子图,最后显示整个画布的图像时,并且让子图自适应来显示。而我遇到了这个就是关于self.figure.tight_layout()的警告,见下图。
& ~0 ?: q! U! V* |4 C) d/ B( c5 \
$ W; V9 ]: {) c& p; ~一般在使用plt创建一个画布后,程序本身会有一个自动调整子图尺寸来使用画布的情况,但是因为我是显示图片,所以这个自适应就出问题了。但是还好,只是警告,不是报错,为了方便,忽略就好…(但是我不推荐这种做法,希望有人研究一下,并把解决问题告诉我)
/ m! f# Z/ {9 M: T8 u9 ~为了方便,我直接在一开始加上下面这句,忽略掉。# n2 x; \( p9 b- W$ {
import warnings
6 j* |! \: T: V+ V0 p# i, ?8 swarnings.filterwarnings("ignore")1 ?3 t+ E: T! m1 v0 I$ P$ K
% \' t* E5 Z0 w% {; K. ~
要点1 K. K' T8 M w$ b
- e; X' M& B0 W& C* n
1旋转图像现成的工具很多,一个是cv2提供的,主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图:
W9 D3 {+ }, e4 i" v, t- d1 f6 ~/ I p; e$ ?' Q
" o$ S* ~7 O3 q& D
0 u) `3 [# o& s
6 L$ n e4 X2 y: i X! G2 u0 l
这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。
- d3 n5 H- G. ^& v1 M. _- R% x L
这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图
+ `7 j; H9 k; c8 ~, b6 o$ d& C% ^! X# t7 R
' w$ n8 u! ` u
) P& t& ~/ l1 }2 Q: |" b
' ]1 T/ L' O# @/ @% t3 j: W
代码#! /usr/bin/env python
3 ]2 U9 ]! J0 p! \4 T$ f. g+ I# -*- coding: utf-8 -*-2 X1 z6 u7 l( V3 x9 b' `8 b% L
# ! python3) X6 {# |4 H- D' D7 P Q t
# f9 e0 b& o W; B
import cv2
- P7 D. z( i+ [4 y+ Q6 e' uimport numpy as np
- K" {! r) c( T6 y2 ofrom PIL import Image
/ i: X+ I+ |. n" |* U6 J' Rfrom matplotlib import pyplot as plt- M6 B+ G A+ m) D! `6 b) G
import matplotlib.image as mpimg
q2 b- w5 k, N; z
( E7 W9 s5 h3 R& _# x8 p2 \def rotate_image(url):
! F( G0 o. d9 P% w$ c #旋转图像,并将其保存为4种角度的图片
/ n* x7 B4 c1 J6 {& V/ }6 L; j7 B- R im = Image.open(url,"r")6 S+ `6 g7 I1 C y
im = im.convert('RGB') #避免有些图报错
8 D% h, F. c- n" Y2 J im.save('image_test/test_0.jpg')" J$ {. D: _# M' o- R1 z/ b5 \( Y
im_90 = im.transpose(Image.ROTATE_90)' X8 S4 Y% X( [( f" a0 V. f
im_90.save('image_test/test_90.jpg')+ e6 c3 y& }" [. C
im_180 = im.transpose(Image.ROTATE_180)$ m! G9 D. ~! Z7 B
im_180.save('image_test/test_180.jpg')
S2 q' s8 i5 u/ Z M im_270 = im.transpose(Image.ROTATE_270)
3 {% B6 e% J- d" O3 j7 u im_270.save('image_test/test_270.jpg')
; x; |* y- h3 Z3 x$ R' @) |% V, R
6 j; M+ M1 ` C. M- Rdef plt_merge_img():
! ]6 n7 y y6 y1 ]8 ?0 A! b #将保存的四种角度的图片,叠加在同一张画布上 f: ~- L6 h. C1 h) Y
#使用plt.figure()创建画布,并用add_axes()来分割区域显示图片
& z9 \' [" r5 c #显示画布,并将其保存为fig_size.png
4 @2 J, _/ i2 G% U6 c1 @ img1 = mpimg.imread('image_test/test_0.jpg')/ Y# S+ e5 Z0 t2 h( q: d Z
img2 = mpimg.imread('image_test/test_90.jpg')7 Q1 T) T4 v' ?( E
img3 = mpimg.imread('image_test/test_180.jpg')% Y# R& {- Q0 ]4 G
img4 = mpimg.imread('image_test/test_270.jpg')
7 p3 q' T. i& Z' K8 p9 @ fig = plt.figure(figsize=(60,59),dpi=96)
! \. p& @9 F3 g/ a$ R, c
( O3 g" t6 k( N8 L& L#上方的横图
5 k/ o7 u( A |% W- C _+ Z' D ax1 = fig.add_axes([0.30,0.55,0.42,0.28])& n5 Q4 A. ]# Y0 z# `
ax1.imshow(img1) C6 Q4 G' Q, W9 K. u' t9 h
ax1.axis('off')
; x4 c1 F% H9 F3 Z( R" n3 Z" }; g
# 右方的竖图
8 W* r, N, N3 K5 H9 Z& V u ax4 = fig.add_axes([0.67, 0.29, 0.28, 0.42])
3 |0 `* s0 r" q$ |3 C) I0 `; G ax4.imshow(img4)
" v$ N* |, C @, `3 g# \4 ~' ^$ R1 O ax4.axis('off')
" v/ ?# Y1 J a0 U# B4 R( G2 s
/ O4 W* J# i) t* Q# 下方的横图
$ l7 m( C) P! N9 L2 {6 }/ ] ax3 = fig.add_axes([0.30, 0.18, 0.42, 0.28])0 D1 ^2 D* a, T( l8 W# v
ax3.imshow(img3)
- ~9 Z& T' j8 u. c) S ax3.axis('off')
. y/ W, B3 e+ {5 r" i: V6 j8 Q3 O& c! O
#左方的竖图: }& d |/ H2 Z, E; c8 ?
ax2 = fig.add_axes([0.07, 0.29, 0.28, 0.42])
7 ?# Q- T! l8 O4 R1 O! O ax2.imshow(img2)8 c0 w1 F' I+ o: L8 m1 C# c% x3 o
ax2.axis('off')! y3 {- N' B+ W* x! {$ N
# 保存为sig_size.png+ q! ^, \: }" Q% I
plt.savefig("fig_size.png",dpi=96)
# F3 w) j, }' k plt.show()( {1 z* N9 B* U0 c3 v/ P+ t
) O% r/ ~9 D" V- m, U& V) xdef main():
; P; b7 |( X6 f# q3 T9 Q$ k url = 'test_1.jpg'
9 N: q# v4 B8 A7 R rotate_image(url)1 N# O* Q6 z$ t& W6 Q
plt_merge_img()
* @# w7 w0 Y" G( [
% O7 D0 ?* h% c' X8 \: ^$ | Mif __name__ == '__main__':" g3 e/ Q# n: ]( ^" E- h# t
import warnings
/ V$ e9 }1 g1 t/ a @ warnings.filterwarnings("ignore")
* R$ {0 p; }/ j) t- w1 T- x main()
3 Z' q O# V9 E& `! d; G+ f- }0 k% K# _( f( ^. B
————————————————% _# F& `( S9 R G" J0 x2 L
版权声明:本文为CSDN博主「你要啥自行车」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。3 [ `, m0 ]/ L
原文链接:https://blog.csdn.net/weixin_42572826/article/details/1060337098 W2 T9 W8 {5 Y
! F6 U% y. @7 w5 g J
& {4 f" E9 `0 c
9 T3 ?* V3 E L# w |
zan
|