- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 565546 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174887
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
7 ?$ \+ q, B+ m) p8 r
python4次旋转图片后,多图叠加显示1 `0 Z0 |/ N/ s) ~1 N3 @
[color=rgba(0, 0, 0, 0.74902)]文章目录
3 i/ K m2 t3 r2 y+ ^- 想要的效果对比,原图VS显示
- 问题
- 要点
- 代码) ]. {/ g* l. ?! B! ^2 b& H$ |
& O# ]) v& N% O: W" M! t. @' f
/ k! n7 _1 O7 |7 y! w9 M( l
[color=rgba(0, 0, 0, 0.74902)]前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog
- S1 W, C" G" j+ N想要的效果对比,原图VS显示
" R: g& [, X2 U
6 f' ^5 G/ X3 j2 q6 o2 ?8 h
7 z, B$ y) Z: Z
问题$ f- |* C4 Q I( T0 ]: _( u! ]
& {* S# v' ]) {6 n/ l(1)在刚写出来时,在rotate_image()函数中没有加,im = im.convert(‘RGB’)这句话,就会出现有的图正常,但是有的图报错,无法保存,并显示下面这句话- l4 |+ B; ?4 A) q! u
( {& ]) I7 B+ u9 ^! I
这个问题可以在这一篇blog找到解决方法。就是im.read(url)后,再将图片转换为RGB格式(image.convert(‘RGB’))。这样就可以避免很多因图片导致的问题
8 e* c l! K* }1 K( B7 T; R
; G; Z8 E: N) ^, k! k(2)在matlabplot中,显示图的第一步是创建画布,plt.figure(),然后在画布上添加子图,最后显示整个画布的图像时,并且让子图自适应来显示。而我遇到了这个就是关于self.figure.tight_layout()的警告,见下图。
- M G- R0 e0 y2 k
9 q( q/ K5 Z: h( k; N一般在使用plt创建一个画布后,程序本身会有一个自动调整子图尺寸来使用画布的情况,但是因为我是显示图片,所以这个自适应就出问题了。但是还好,只是警告,不是报错,为了方便,忽略就好…(但是我不推荐这种做法,希望有人研究一下,并把解决问题告诉我). n: V" e7 r) A4 i d3 d d
为了方便,我直接在一开始加上下面这句,忽略掉。
3 O" e7 Q5 b3 ]2 B7 t7 {import warnings w9 {6 L8 `$ q
warnings.filterwarnings("ignore")
: `9 b9 E8 P! e3 _
- b, T, D: Y" I _' M3 o/ ~5 j要点3 ]; u8 |, _" e7 a$ h
" p! D# w* L' S/ v0 M: J9 c1旋转图像现成的工具很多,一个是cv2提供的,主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图:
) |9 c6 m4 ^3 K
1 z% o. J) ~* J0 K1 V9 w* a; a) E
q+ `. ^- B1 ^+ K( D- V% J* K# {
" I. A3 m- [. d" {
这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。8 ~- |6 E. t7 c5 `! s
; I! Y6 y0 _ Y: j
这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图1 Z4 V- t3 f( [2 i4 b+ P
s) p6 `" l1 o2 E3 N/ b
9 C( }" K+ w' S8 {5 M& }
w; V) @9 g" j: }& K; m4 a1 F3 Q
2 Y( }7 ~% O* t. [8 _3 C2 ^
代码#! /usr/bin/env python: A1 C& e6 }4 P
# -*- coding: utf-8 -*-* k) G! s+ ]5 V7 W5 v
# ! python3
C" ]+ g+ M: D. b
9 F1 s( c+ s1 D* @$ x7 C# Pimport cv24 b! P; ~ z2 r
import numpy as np
# G( ?9 g! S, z3 _+ [7 f& gfrom PIL import Image; h! l8 T$ w( l' a7 g9 B- }2 m
from matplotlib import pyplot as plt! K4 [, D' u H" Y6 V) m
import matplotlib.image as mpimg
" F: O0 S) O2 V- ]" ^% J" w U/ o
; e, h& b r5 X; Wdef rotate_image(url):) d9 D3 T4 Q+ Z" o t9 l
#旋转图像,并将其保存为4种角度的图片
3 `7 A/ Q7 O% K1 T im = Image.open(url,"r")/ U9 g. L. D/ l4 I
im = im.convert('RGB') #避免有些图报错 " r+ A) P0 P+ B' m$ X
im.save('image_test/test_0.jpg')
& C9 f+ o" a4 w4 B& }8 o im_90 = im.transpose(Image.ROTATE_90)
4 H! |: @6 r7 K5 h# T im_90.save('image_test/test_90.jpg')7 X; ~6 U' q. A
im_180 = im.transpose(Image.ROTATE_180)2 r, ~" i; N* G0 o
im_180.save('image_test/test_180.jpg')
( ~ [; M8 j7 k- K* t% \ im_270 = im.transpose(Image.ROTATE_270). q; g; `( S; y( Y3 E+ C) U
im_270.save('image_test/test_270.jpg')
- X) H! f- v; D% ^. Z) ~
$ j f& ]6 ?2 b+ {/ L$ n Ydef plt_merge_img():
* A2 x" W: O3 j _ #将保存的四种角度的图片,叠加在同一张画布上# _# N% L1 m7 \
#使用plt.figure()创建画布,并用add_axes()来分割区域显示图片0 U# N N9 F/ z3 p1 y5 e% A! T
#显示画布,并将其保存为fig_size.png1 e; j, L1 A+ `
img1 = mpimg.imread('image_test/test_0.jpg'), e9 l: z2 b5 b) V7 r6 `- Z6 k
img2 = mpimg.imread('image_test/test_90.jpg')( { u0 z# ^7 O2 m/ N
img3 = mpimg.imread('image_test/test_180.jpg')
& r/ h B. H$ Z$ U( ]+ [ img4 = mpimg.imread('image_test/test_270.jpg')
8 U0 v: W, ^- r; @7 e) `9 m; ? fig = plt.figure(figsize=(60,59),dpi=96)/ q$ T0 Q' V) l+ A
* `% ^# Q8 s! h1 h
#上方的横图
5 e& t I+ P+ \" H- \0 r/ O" a ax1 = fig.add_axes([0.30,0.55,0.42,0.28])
; A! X3 H8 o" j) c* u ax1.imshow(img1)
! A3 _( {9 C' d9 z- o' ~) o ax1.axis('off')9 w9 L Y1 W$ `7 V
" D# k1 U; L; l) W1 V# 右方的竖图
6 U& ]" v! U, k ax4 = fig.add_axes([0.67, 0.29, 0.28, 0.42])
2 ^9 [6 o! v" U( T) v/ l: ^ ax4.imshow(img4)
+ ~9 _) B7 X& o+ V1 O ax4.axis('off')4 y6 `5 m3 }( j
/ j# L- k' }7 C8 V# 下方的横图1 `- Q& h: n y" H5 h0 j" L2 f
ax3 = fig.add_axes([0.30, 0.18, 0.42, 0.28])" a, F- h L/ |/ O C7 |2 G+ B7 Y
ax3.imshow(img3)5 c4 L1 `$ u0 X1 v* I
ax3.axis('off')9 }5 _% z5 B) a
% Y3 h7 k% C/ I- p$ w; U
#左方的竖图
4 W4 L# ?. n- h: ] ax2 = fig.add_axes([0.07, 0.29, 0.28, 0.42]). F5 j; M3 Z7 @& T$ s- ]9 w
ax2.imshow(img2) L& i6 ?* t4 d: Q* Z- h
ax2.axis('off')% v) G2 X6 Z. ]; p1 Y- M
# 保存为sig_size.png
( N e! X1 C( d plt.savefig("fig_size.png",dpi=96)/ L, Y+ R4 |0 V [8 j& F
plt.show()/ v" ^- E. K; j/ I2 y" f% E3 m
0 \- V# C$ M z X6 ~! A3 I
def main():
/ B$ Z# b& I0 m% e3 @! W url = 'test_1.jpg'; U0 e4 e* s5 x. i4 Q
rotate_image(url)
8 M- l7 B. I. a$ `" a plt_merge_img() A! \3 R4 D' s& [' }
8 z: J' F9 V. J5 Q4 S$ Rif __name__ == '__main__':5 P. N4 A" v2 D# X
import warnings
3 M! Z$ S5 [8 m" x7 q8 F$ I warnings.filterwarnings("ignore")9 ?& ^$ T( I! u! F3 P
main(), k+ M# V. ~# I% @2 z3 x
9 \( w" _, b9 H4 I$ L
————————————————
% k c; @& e% h3 v( Q$ _+ Y版权声明:本文为CSDN博主「你要啥自行车」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。* f6 T- Q/ p, C* `; L" P
原文链接:https://blog.csdn.net/weixin_42572826/article/details/106033709
! T8 K5 Z# W# `
0 \- `" w% K. L8 M$ @
6 ?' o% v) B d3 h% L5 O4 ~4 |' R5 C; B( V, M
|
zan
|