- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563414 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174247
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
0 B9 [* a- P* Y9 ^& o8 b/ a2 b3 Cpython4次旋转图片后,多图叠加显示
2 d9 K. z ]8 z) ], p0 h K( M1 c8 j[color=rgba(0, 0, 0, 0.74902)]文章目录# K$ F9 g0 S3 h! |2 k/ P
- 想要的效果对比,原图VS显示
- 问题
- 要点
- 代码
9 u0 F2 U: ?9 @: u
- _- V: f/ \ |9 E
% V9 Y/ m ] G
[color=rgba(0, 0, 0, 0.74902)]前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog
9 b1 i0 a. X- R: Q5 b, t) v' S2 D想要的效果对比,原图VS显示
# w h$ M9 t8 h0 T% O" b r% e) _, O+ q4 ~6 k9 \- \
. _( j: K9 |7 J0 a9 F4 j3 P% J
问题
( j1 i+ V4 Y" z- L2 s( K) ]" G8 W1 L
(1)在刚写出来时,在rotate_image()函数中没有加,im = im.convert(‘RGB’)这句话,就会出现有的图正常,但是有的图报错,无法保存,并显示下面这句话
1 T3 o# j, ~" O6 [3 g6 |; X8 j3 c6 o4 L9 o {2 W. U$ U" ^
这个问题可以在这一篇blog找到解决方法。就是im.read(url)后,再将图片转换为RGB格式(image.convert(‘RGB’))。这样就可以避免很多因图片导致的问题
! ?8 l$ N( p, R- T5 ]) i- M% x1 a5 O. W
(2)在matlabplot中,显示图的第一步是创建画布,plt.figure(),然后在画布上添加子图,最后显示整个画布的图像时,并且让子图自适应来显示。而我遇到了这个就是关于self.figure.tight_layout()的警告,见下图。* c( [$ w1 h% h' A$ h& M
0 f+ x/ h. T! h
一般在使用plt创建一个画布后,程序本身会有一个自动调整子图尺寸来使用画布的情况,但是因为我是显示图片,所以这个自适应就出问题了。但是还好,只是警告,不是报错,为了方便,忽略就好…(但是我不推荐这种做法,希望有人研究一下,并把解决问题告诉我); U& D( F( A% Y* \
为了方便,我直接在一开始加上下面这句,忽略掉。* K$ }, l# w6 l! ?
import warnings
* n" G' Q7 |8 O' Wwarnings.filterwarnings("ignore")# `+ O; C" x; j5 O" p% T
2 C# K. s) T* ]5 B7 V- k6 L
要点
. c4 O7 `+ M: ~1 ]& { F. l4 A$ L0 W1 z
1旋转图像现成的工具很多,一个是cv2提供的,主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图:3 V) P7 d7 K/ W
/ y# V6 _( Y1 w. p) I3 h% j. c* t- e3 E" v4 s( d. K0 t
9 Q' d, i) K% T" r+ L4 l* R
9 R" l. ^6 b. w这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。( S, P7 [/ W& V) F' g m2 |
0 ? i; y. u3 `8 k0 Q9 M! ]这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图; j- a/ @. E* h! |5 B" k& d" ^% s' c' b* d
2 b& X$ k+ D" k* N! d* S% h
& O+ X7 B h: c& F" W
8 [# D7 n7 O" x" s5 d# t4 M! c% G, w! n6 b
代码#! /usr/bin/env python
3 T5 g+ A0 s& f8 m# -*- coding: utf-8 -*-- F4 h0 r; O1 x$ v: B# z' N
# ! python3: `$ x+ v$ ], c7 e
& V* R( v% ^& ^1 g: Bimport cv24 h6 B4 g5 C0 ]9 \
import numpy as np2 ]( P& j: o, {0 R8 [- C
from PIL import Image3 N, T& k) A, g
from matplotlib import pyplot as plt7 u* x2 y/ {: b- I1 o
import matplotlib.image as mpimg& B6 X" o" q" @3 u* ]' G: u5 M! |
* P' o/ n/ q* [# ^" v% S; B
def rotate_image(url):
, J; N" s9 j6 \8 ^ #旋转图像,并将其保存为4种角度的图片
# r1 G0 ^# f9 x im = Image.open(url,"r")
0 \; ^( v* @: V* h# n$ P* j! a im = im.convert('RGB') #避免有些图报错 5 J- D# J* i, ~) G' P
im.save('image_test/test_0.jpg') n5 d; ~+ a5 K
im_90 = im.transpose(Image.ROTATE_90)
z6 ]4 p/ t: ~( \7 J im_90.save('image_test/test_90.jpg')
# S5 r. u* b1 U1 ~$ R im_180 = im.transpose(Image.ROTATE_180)
7 C' X! H: H( S# i im_180.save('image_test/test_180.jpg')
u, ]* g$ v! W/ h4 j im_270 = im.transpose(Image.ROTATE_270)
( q4 O) F5 \/ Q1 c5 E/ J im_270.save('image_test/test_270.jpg')
- }/ h; s( h3 P; q0 y. g1 ^; Q- [" _* y7 y2 p+ Q1 N+ u4 e
def plt_merge_img():
" m7 v& {" K; D, U% t #将保存的四种角度的图片,叠加在同一张画布上* ~7 C. A9 j" B9 K9 o
#使用plt.figure()创建画布,并用add_axes()来分割区域显示图片
/ ]# t# Y5 U1 s; r5 o #显示画布,并将其保存为fig_size.png
4 f) |$ k0 O' H* e: P img1 = mpimg.imread('image_test/test_0.jpg')
9 J1 _4 \0 r. N, ?& L, } img2 = mpimg.imread('image_test/test_90.jpg')8 V& o4 E: X. e. D* z# d; u: x
img3 = mpimg.imread('image_test/test_180.jpg')
! b: [: Q" Q( f2 R: e9 q) v img4 = mpimg.imread('image_test/test_270.jpg')( _7 t7 L! k( `9 R, k: Q
fig = plt.figure(figsize=(60,59),dpi=96)
* C( ^9 F% Z/ n- ^. R/ Y% w5 D; U
* ]+ P# l/ L9 o1 \! F7 P#上方的横图" e; v" m* E& h2 n" T" h
ax1 = fig.add_axes([0.30,0.55,0.42,0.28])
3 ?% F; b+ d, n9 |5 y. T3 p! ^& { ax1.imshow(img1). `( c9 l# }3 Y' c' ~
ax1.axis('off')
$ T- Q3 J2 @) b- f+ E8 Y
6 J; t+ x/ c$ Y& Y- `5 ^# 右方的竖图
+ e2 H- \, k% O* `4 E ax4 = fig.add_axes([0.67, 0.29, 0.28, 0.42])
1 V0 o3 Q/ t& q ax4.imshow(img4)5 l( @) | ]1 n: S
ax4.axis('off')
8 x$ U. N: u4 o. q$ Q7 T/ S. L6 o' u/ k
# 下方的横图 g6 m6 x \% M6 q/ @3 V: y- l$ B
ax3 = fig.add_axes([0.30, 0.18, 0.42, 0.28])
8 v1 D( j' B1 c6 |9 K ax3.imshow(img3)
% [: s( s& i( S. j; V) r* G7 r ax3.axis('off'), q+ s6 q* f4 t, U
, q* c4 L Q, E1 Z A$ m0 H# a#左方的竖图1 p" j' ^ ~! E# m- y0 S
ax2 = fig.add_axes([0.07, 0.29, 0.28, 0.42])0 x% k8 b6 A. f; Y6 L& D
ax2.imshow(img2)
5 |9 k& \3 A& ]& J; Q1 P ax2.axis('off')
0 \$ } e( M7 K+ \# ^" k # 保存为sig_size.png
+ n0 I4 g( k" \( i plt.savefig("fig_size.png",dpi=96)
0 |3 d- B1 C5 A1 ^) S$ h7 j/ K, Q plt.show()
2 L4 X6 ?3 L( r1 \9 g; a
; r+ P0 A8 s1 zdef main():/ a' n6 \9 d$ ]- z+ F7 d& _+ ?
url = 'test_1.jpg'
1 s8 ^0 e' g6 j/ q rotate_image(url)
5 \: D) Y9 X% S8 O' l0 d/ j plt_merge_img()1 ~4 Q2 {' h# v8 f0 {8 I- T- A
9 Q$ R ~5 N7 | v+ Q3 g5 x$ N. [if __name__ == '__main__':
; K, G' I! O+ s1 w import warnings6 Y% p1 ^/ d& C, ~2 z9 y
warnings.filterwarnings("ignore")* V) f3 |) l0 e# b1 J& @
main()* H! V+ L( W) j" ?/ m
6 J. X! w% w& C( M7 D* K1 G3 I3 Y
————————————————
1 o! ]3 M+ `; d# ]$ b+ J* |版权声明:本文为CSDN博主「你要啥自行车」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
% D d8 a. e0 z A原文链接:https://blog.csdn.net/weixin_42572826/article/details/106033709
0 t, N1 e0 f: f1 e+ X" L( B6 v$ P M8 b' y6 `+ p6 D: Q: D O7 l
6 @6 L; a) O3 N* L0 [0 Q4 e5 p$ o" b% b5 ~) y
|
zan
|