- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 564679 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174627
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
2 |, B4 f& Q" e
python4次旋转图片后,多图叠加显示- B9 Q* p% V, F x/ t
[color=rgba(0, 0, 0, 0.74902)]文章目录7 a E% _8 S' E2 V, n, Z5 `( E
- 想要的效果对比,原图VS显示
- 问题
- 要点
- 代码2 D+ `" c6 b$ d. `8 ?0 I/ ?
, X$ `. r1 |, S7 |. {. x1 O" N5 w4 \! ?
[color=rgba(0, 0, 0, 0.74902)]前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog( F3 e7 n c7 A
想要的效果对比,原图VS显示
7 F# k' ]7 Z2 S# `$ i' A) K9 T8 ^% i0 ^- a e" x* V
4 @5 G! K7 n7 T+ L' ~* Z2 ~7 r问题
3 m% v( M8 S: V! n7 Q, ^# C$ _7 s Q( D/ [, C$ f& F5 m
(1)在刚写出来时,在rotate_image()函数中没有加,im = im.convert(‘RGB’)这句话,就会出现有的图正常,但是有的图报错,无法保存,并显示下面这句话
9 e, P- s1 j0 O8 M6 A" u' S' `, _- g2 D' w4 |! f
这个问题可以在这一篇blog找到解决方法。就是im.read(url)后,再将图片转换为RGB格式(image.convert(‘RGB’))。这样就可以避免很多因图片导致的问题
& Q/ A% r2 F5 x! W8 N. v# V- ?. k a* }7 B" Y# \% B% f
(2)在matlabplot中,显示图的第一步是创建画布,plt.figure(),然后在画布上添加子图,最后显示整个画布的图像时,并且让子图自适应来显示。而我遇到了这个就是关于self.figure.tight_layout()的警告,见下图。
" D: n3 N8 I& @9 a: T3 K9 N( h# n' I) d" K0 U9 N# ?
一般在使用plt创建一个画布后,程序本身会有一个自动调整子图尺寸来使用画布的情况,但是因为我是显示图片,所以这个自适应就出问题了。但是还好,只是警告,不是报错,为了方便,忽略就好…(但是我不推荐这种做法,希望有人研究一下,并把解决问题告诉我)5 f- r% Q. W! M3 t! S' G9 t, P
为了方便,我直接在一开始加上下面这句,忽略掉。
* H5 ?/ F- V" H. [4 {! v6 ximport warnings" K/ d. s% `' @! f9 R# w
warnings.filterwarnings("ignore")6 j# d: q3 E0 H8 M' D) s6 j! e
' R# f* W- |, o/ j2 u
要点
3 `1 _* ~4 N* y2 A z' k9 \
. T! G2 A/ a, l' }" I! \: @7 I1旋转图像现成的工具很多,一个是cv2提供的,主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图:
( i8 P! d, Z/ Y1 h4 S9 N5 h' h& M! ~ C1 D, }/ P' I% j8 T4 W
" l4 d: A {3 R% b, L& I; b
/ g5 D- b9 A* a' M4 p* `! ^
% C0 }% E* j0 P, y' j这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。
1 J; ^9 M( {" T1 ]0 _2 t2 w
" Q' ]5 `- f+ x7 w9 M! _这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图& o f4 w: K0 ~9 O
- N9 t0 [! u; q! N9 _ b0 r
9 p+ k& u4 w5 M% L+ U) s) H
$ V9 z6 y, I2 k1 `# y
' m @/ x0 V, T3 \' s3 s" J! v代码#! /usr/bin/env python
2 t1 p- Z4 H+ x" {4 H- F# -*- coding: utf-8 -*-
% L" z3 f) G* a& p' Q/ o* t3 g# |# ! python3
' t/ U/ R$ l7 i
; Z3 p) K1 v: D& Yimport cv2 O8 Q3 }2 W5 f2 Z: }
import numpy as np
; r! x5 G1 X; {6 V. O* ~from PIL import Image
; q0 O6 @0 \1 F+ u7 h; B( E4 Yfrom matplotlib import pyplot as plt# z1 U' [9 z1 |6 n
import matplotlib.image as mpimg
- a$ y' u/ Y* ]
" a4 C- T/ [0 C( Edef rotate_image(url):6 l4 s G9 c9 K. k+ E! n$ Z
#旋转图像,并将其保存为4种角度的图片
9 w4 B E3 ^0 [3 p, K$ Q im = Image.open(url,"r")& T, h+ x9 [4 O U. I
im = im.convert('RGB') #避免有些图报错 : L" p$ }" c4 U
im.save('image_test/test_0.jpg')
: H m( Y" U6 }# }, C, E im_90 = im.transpose(Image.ROTATE_90); L. Q! c0 N' v
im_90.save('image_test/test_90.jpg')
! g4 b$ Z$ }8 B1 R7 E3 [4 t im_180 = im.transpose(Image.ROTATE_180)
- U+ j. l' p8 a" S+ z) |; [ im_180.save('image_test/test_180.jpg')
& Q; r6 I7 v& j$ H+ F5 {' U; D! T im_270 = im.transpose(Image.ROTATE_270)+ l9 J. j, l3 ]9 F. c
im_270.save('image_test/test_270.jpg')& Q8 e! T. X9 i) B% ?/ m
7 m+ G7 `+ N& y7 y8 O" Z) o
def plt_merge_img():* E: o; t! O9 u Y+ a
#将保存的四种角度的图片,叠加在同一张画布上( ?+ q X) j# ]; I) j# x% B
#使用plt.figure()创建画布,并用add_axes()来分割区域显示图片
' l4 c6 q X3 Z) s9 O8 S #显示画布,并将其保存为fig_size.png
2 a4 [+ p1 S" Q8 @( v* \ img1 = mpimg.imread('image_test/test_0.jpg')
6 ~$ _ N/ D: @) [ X" [ img2 = mpimg.imread('image_test/test_90.jpg')
. W6 G0 z1 e( _) [; Z$ k& `0 ? img3 = mpimg.imread('image_test/test_180.jpg')
) o/ w n6 `2 @* O2 s/ I img4 = mpimg.imread('image_test/test_270.jpg')+ m C& B3 w# D6 n7 }6 e5 }; y
fig = plt.figure(figsize=(60,59),dpi=96)
% n8 R' u; ~! F8 C
# A) t/ L2 b9 _) Z+ d1 ?#上方的横图
5 h* H3 C, |& z& i: A* ] ax1 = fig.add_axes([0.30,0.55,0.42,0.28])/ A: S m7 |1 A: x3 W. d% Y
ax1.imshow(img1)# f# h/ E2 z/ F; V& h0 Z5 V; K
ax1.axis('off')
( u( s3 p; Y6 r2 F* A% {! |
3 \9 T* @# V" u# 右方的竖图
5 H; Y+ r1 x ?3 Y0 Z+ G2 T. z ax4 = fig.add_axes([0.67, 0.29, 0.28, 0.42])7 }, G3 c, K9 a9 ?# X! t+ s p# B
ax4.imshow(img4)
( w3 M9 ^+ {, \1 q1 Y ax4.axis('off')
, v+ f0 ^" I8 }2 K1 e0 E& Y: y3 f: h
# 下方的横图
' e" u K$ m1 ^ ax3 = fig.add_axes([0.30, 0.18, 0.42, 0.28])
5 R4 A) ~1 N% f$ e ax3.imshow(img3)
) ^$ X: `* G" F- Z9 t ax3.axis('off')6 T1 w2 b4 I7 d1 h0 x0 {
' F R: `4 h4 \5 s
#左方的竖图4 q, P) M l. u8 Y
ax2 = fig.add_axes([0.07, 0.29, 0.28, 0.42])" I0 P, y7 Y a; L% f
ax2.imshow(img2)
+ ~/ h4 k7 X; r ax2.axis('off')
; _- U$ t/ p1 p1 n) l+ f # 保存为sig_size.png4 J# W2 V+ A: ?% ~' l
plt.savefig("fig_size.png",dpi=96)
& g) E* Q2 I: N( N( } N: G. v8 ~ plt.show()
+ L: Z7 D" [0 u2 x% E3 r' B6 J8 n# n; w4 [ j- f
def main():/ f9 W8 @! f0 u$ ^3 t
url = 'test_1.jpg'
. X$ p. |3 v4 | rotate_image(url). L/ ]7 T. x/ D1 {
plt_merge_img()
/ `/ W8 {0 U# U+ j
, v5 f2 v$ E4 ?9 S; lif __name__ == '__main__':
! V3 t4 C. x: e2 r! F import warnings9 K5 f2 N; p, d# B r& g
warnings.filterwarnings("ignore")
5 Y7 `0 }# @7 g3 }% e, k main()
, ~6 Z" u; u' B7 i0 l L" ~; O) l; R" H1 k: ? h" u$ g5 {
————————————————0 _7 l" g% Y& ]: r
版权声明:本文为CSDN博主「你要啥自行车」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
1 @" ~# @ ?; @# Y: w$ |( x) p& U原文链接:https://blog.csdn.net/weixin_42572826/article/details/106033709
* e% X5 c% d/ \7 i# L5 h$ e: U
" i' Q" p7 m3 Y9 M3 t+ F
7 I! v/ M8 c& ^( a; O$ J: o! Q) x
9 D# I& P! a6 F+ _ |
zan
|