- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 566728 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 175241
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
& C$ Y1 _+ V4 n% e
python4次旋转图片后,多图叠加显示
" W3 O% V$ i5 b& F; C[color=rgba(0, 0, 0, 0.74902)]文章目录
% S% U* h) h5 U# n3 u' D4 [- 想要的效果对比,原图VS显示
- 问题
- 要点
- 代码
. ~* b5 r- v) E$ Y9 ~1 C
$ b3 e2 x) b. f. O! A T' g; v
4 m2 ]' {" ?. L, D- n[color=rgba(0, 0, 0, 0.74902)]前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog
. g& n2 K, b7 C' k' U: _想要的效果对比,原图VS显示
- x) M! D$ j+ b8 n9 w4 _6 `
) a- L. O% n: X% s- D+ \) _& T
' {* X4 M& ?6 f3 @2 O问题" f, ]' |1 v$ F7 b1 K
- e5 n& ]) h8 R- w) R, p1 k
(1)在刚写出来时,在rotate_image()函数中没有加,im = im.convert(‘RGB’)这句话,就会出现有的图正常,但是有的图报错,无法保存,并显示下面这句话
8 M0 E4 J9 u7 B# V3 I; T
2 D& W$ F! L+ V' |1 c F) ^这个问题可以在这一篇blog找到解决方法。就是im.read(url)后,再将图片转换为RGB格式(image.convert(‘RGB’))。这样就可以避免很多因图片导致的问题
( ?) o* ?9 U J% O: I4 a8 D! L+ C3 Q8 ^5 m8 a8 @. J7 e2 t. @
(2)在matlabplot中,显示图的第一步是创建画布,plt.figure(),然后在画布上添加子图,最后显示整个画布的图像时,并且让子图自适应来显示。而我遇到了这个就是关于self.figure.tight_layout()的警告,见下图。; H4 l1 [/ D& Z( H* S5 ]7 r
- _4 l R# ?0 A* L
一般在使用plt创建一个画布后,程序本身会有一个自动调整子图尺寸来使用画布的情况,但是因为我是显示图片,所以这个自适应就出问题了。但是还好,只是警告,不是报错,为了方便,忽略就好…(但是我不推荐这种做法,希望有人研究一下,并把解决问题告诉我)1 c4 G) z( j, h u. A- J
为了方便,我直接在一开始加上下面这句,忽略掉。
/ `+ P2 J1 N2 A Y; q5 timport warnings: K- h3 C' W: u1 i
warnings.filterwarnings("ignore")5 [4 f, E' @ ^$ v O: Q
" ?" W, n4 A" B
要点
' |2 l2 `5 k0 Z/ ^ H. ^ W) O2 p1 Y0 c, |
1旋转图像现成的工具很多,一个是cv2提供的,主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图:7 V9 C, X$ Q3 I" d8 H0 v3 Y
0 D, V6 d, e" _2 E, ~
' |' c5 u8 \: e4 m& {
3 ?& G Y& s0 ]' K
3 P- x! L6 P# o2 q
这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。
: r9 C: r0 d `$ s9 q; D5 E& |8 ~1 B* w7 z9 O; a' w; K: ]8 m
这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图
6 o( K8 c8 p' D1 x
+ V( ?7 V7 {9 S1 [% x8 K( Y& d4 z0 q S8 \/ t
# ?2 G& @9 u5 j2 ]
+ V5 i1 k, h* B代码#! /usr/bin/env python
6 b9 L+ K1 o Q- z5 H9 P# -*- coding: utf-8 -*- t6 J, c% a. \' V% D2 u
# ! python3
1 z# ?! k+ y6 r6 c: I; p S# A4 r5 u3 Y7 \: R" O7 m' x' L( V
import cv2
3 c( l" q h8 W* h6 limport numpy as np! J6 s, m( e# z) d! U+ ~% y
from PIL import Image
& z2 I$ b% T2 N0 sfrom matplotlib import pyplot as plt2 ]5 D( p) g+ @" _# q
import matplotlib.image as mpimg C/ ~0 m$ K: o2 Z
8 [# Z# p# y8 V1 w- {; xdef rotate_image(url):2 l# C" X- g( U5 n* I f* d
#旋转图像,并将其保存为4种角度的图片
/ M, s: T, O: v, A im = Image.open(url,"r")
) x( V# t7 G) S+ K" S* m im = im.convert('RGB') #避免有些图报错
. u# m! G! c3 a U im.save('image_test/test_0.jpg')
) K, _# T3 A& S r) D im_90 = im.transpose(Image.ROTATE_90)7 Q) d1 Q% ]9 x2 [8 b Z7 x7 {
im_90.save('image_test/test_90.jpg')( C& y* T5 E0 C3 b8 B4 F& F" D
im_180 = im.transpose(Image.ROTATE_180)& W$ E1 f6 {3 x9 w6 x
im_180.save('image_test/test_180.jpg')7 ~' x& t0 `: e1 D" z- T1 L {
im_270 = im.transpose(Image.ROTATE_270)
1 t( `' e, I! x0 R, I9 X im_270.save('image_test/test_270.jpg')
) x& O' s7 F6 h5 s7 e0 r. I. F2 Z: v4 N9 M
def plt_merge_img():
. ], M3 w$ d9 C #将保存的四种角度的图片,叠加在同一张画布上
8 L! M* r( G, Q" M2 ^0 H0 v #使用plt.figure()创建画布,并用add_axes()来分割区域显示图片
6 r4 ~2 ]- M3 H #显示画布,并将其保存为fig_size.png
9 w1 ]" s% l, h; Y+ K; J' q+ G( x img1 = mpimg.imread('image_test/test_0.jpg')
7 ~9 s5 p, a+ g1 |; p/ ? img2 = mpimg.imread('image_test/test_90.jpg')
! T) B/ |8 d) I7 z; A img3 = mpimg.imread('image_test/test_180.jpg')( s6 Z S7 _" @, e/ |, ]& {7 C
img4 = mpimg.imread('image_test/test_270.jpg'); `- |# `$ G+ v
fig = plt.figure(figsize=(60,59),dpi=96)
- g1 ?! P- ~$ o* l4 r! R' t, L/ _- r! W, y% |. k4 A
#上方的横图& Q" `4 j7 t/ Z k0 i9 J! g
ax1 = fig.add_axes([0.30,0.55,0.42,0.28])" S# U; c7 U# g* Q2 t
ax1.imshow(img1): M. s7 U7 J. G: J
ax1.axis('off')
2 Q7 j$ H% d2 Y& Q4 D9 y
2 n( q0 k s4 b# 右方的竖图
& d" p2 t6 T1 r! O* i# b. U ax4 = fig.add_axes([0.67, 0.29, 0.28, 0.42]); k" X. y0 U) ?2 P" w
ax4.imshow(img4)
) s' `1 r4 H. B, b ax4.axis('off')! x, I3 i8 r- o' u- d
$ a0 c! m! ` B4 P( H# 下方的横图
+ Y% e0 Q W+ t3 l7 ]( Y; D ax3 = fig.add_axes([0.30, 0.18, 0.42, 0.28])
9 Y9 [, Z7 W, g0 H ax3.imshow(img3)
/ M, z$ L: o! I! v* X) D# `6 @ ax3.axis('off'). S* D1 K/ C7 B
/ K4 x. ~. z& o$ Z3 s
#左方的竖图1 [* B& v$ W: a" ]8 `4 U- h9 W
ax2 = fig.add_axes([0.07, 0.29, 0.28, 0.42])7 w3 M A$ v! g* l0 U& D- h
ax2.imshow(img2). W/ ~0 b n6 o: R7 T: f, x
ax2.axis('off')0 w+ Y x) @$ D$ N4 ^4 g
# 保存为sig_size.png
! P9 U- d( a( d: Z plt.savefig("fig_size.png",dpi=96)& }5 q# [, j% Z7 a6 Q" D \
plt.show()7 y9 f# A' j s9 s$ J/ F
- z: i. `' V3 H; l- [7 Z ~9 idef main():
" r! ]; w2 c: z: ~ url = 'test_1.jpg'% N7 h7 X" J' }5 |! h# `( p$ V
rotate_image(url)
! b; n. N8 A/ H7 y; i" v plt_merge_img()
4 G. ]/ Y( Q/ n" B+ h
4 d0 }- e: y- c. r/ X/ `if __name__ == '__main__':
5 l; ^2 }3 N. }8 ^$ m* e import warnings0 c# c" v( c( c# s
warnings.filterwarnings("ignore")' k7 ^/ ~. [& Q m9 r, v
main()
( O* S8 O: d* S9 u5 }) G$ F& W
7 s+ l P7 ^- J' F/ m8 \————————————————
2 y# N# x$ b' P版权声明:本文为CSDN博主「你要啥自行车」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
. ^$ g" E( ] T. C U- y+ H原文链接:https://blog.csdn.net/weixin_42572826/article/details/106033709) z! _1 ?3 F/ Z
+ p; L- X" a/ H. E" @
2 C, x( T# ~, h2 Z7 |
! R6 ^9 Y3 @& X$ H) o& @# f |
zan
|