- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 565545 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174886
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
4 S4 V6 u. t8 V1 \$ v( bpython4次旋转图片后,多图叠加显示
( i& K) K" c+ E* i8 e[color=rgba(0, 0, 0, 0.74902)]文章目录
+ _; P* N/ p! [( _: d7 N- 想要的效果对比,原图VS显示
- 问题
- 要点
- 代码
6 Q) ~5 k; F7 d- Q
% h8 d) ]+ R3 q& w7 @+ b, V
; M( d+ S9 ^, k6 W! _[color=rgba(0, 0, 0, 0.74902)]前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog
+ a- r( B9 p9 h; J想要的效果对比,原图VS显示
& {; C. |2 ~" B8 b
) h; o4 L2 T" R- w$ C, C
& N( C; ~5 t0 Q问题
* n0 u9 d! v9 O9 A! \4 G* W) J+ B2 W {( p: n4 U' @3 E
(1)在刚写出来时,在rotate_image()函数中没有加,im = im.convert(‘RGB’)这句话,就会出现有的图正常,但是有的图报错,无法保存,并显示下面这句话1 E$ D1 @+ t2 ?/ A. I
g. _0 `; e1 Y, C% L这个问题可以在这一篇blog找到解决方法。就是im.read(url)后,再将图片转换为RGB格式(image.convert(‘RGB’))。这样就可以避免很多因图片导致的问题
" R6 r$ v1 v6 N9 X
4 S; }# B7 ^4 H" h7 d6 B9 B! r4 F(2)在matlabplot中,显示图的第一步是创建画布,plt.figure(),然后在画布上添加子图,最后显示整个画布的图像时,并且让子图自适应来显示。而我遇到了这个就是关于self.figure.tight_layout()的警告,见下图。
5 ]; B' F2 K+ u( J
: R$ C n8 C( g! y' d( O4 k一般在使用plt创建一个画布后,程序本身会有一个自动调整子图尺寸来使用画布的情况,但是因为我是显示图片,所以这个自适应就出问题了。但是还好,只是警告,不是报错,为了方便,忽略就好…(但是我不推荐这种做法,希望有人研究一下,并把解决问题告诉我)& t/ f+ \2 }( `2 l( u8 ~4 e$ q( S
为了方便,我直接在一开始加上下面这句,忽略掉。
& O5 f7 |8 i2 R; }import warnings, p5 Q- \% J) J7 K4 u) |
warnings.filterwarnings("ignore")! D( `% I: r# x; F# |3 x
2 e+ \: j2 C6 l5 h( {5 g要点& f( E I5 `* I& B
6 a, i& @2 R1 M2 z' V1旋转图像现成的工具很多,一个是cv2提供的,主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图: z0 X, t$ `; m
7 \, p7 Q& \( ?/ L
@: G. m* @4 |) }8 _
1 s! G7 B" t. e* `% }$ e
* \- h I+ O) a) S7 m这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。/ b4 m3 F5 Y7 z: o; T
5 L( G4 d( c9 P/ f5 n这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图' F }' M: J4 x. _! O; |' y" [6 L
" T6 q; m, H% m" Z/ A6 r0 n
, x4 f. y0 k& r0 R {8 i3 r
0 q6 O& ^! ?: K" l3 V) b+ f
# i, F; l p. Y+ K/ f2 u代码#! /usr/bin/env python
" s/ t6 `1 ^& h/ V$ R$ W3 F! t0 ?) b# -*- coding: utf-8 -*-7 d- _3 | B" t& d0 c
# ! python3
: M6 S1 \. W& b: I0 P( R7 P+ N0 y4 [
import cv2
( `7 g' w4 f3 i9 f# Timport numpy as np
' ~' ^' W4 w' B3 C5 J8 v7 ufrom PIL import Image
2 A, i4 G4 v9 C+ \$ Q7 j( [from matplotlib import pyplot as plt
$ n* {, V0 E3 d, simport matplotlib.image as mpimg- p4 t& C, I0 y( `- }) `% T7 T
) Q3 ~. Y ? G, j
def rotate_image(url):
% d1 \/ p8 d+ x+ l; E0 e7 u, y #旋转图像,并将其保存为4种角度的图片
( I. c/ y; y1 `5 M" Q im = Image.open(url,"r")4 k/ |# t+ D e& B* a' K8 Y
im = im.convert('RGB') #避免有些图报错 $ o. Y, [, _1 J) T7 _6 r l* t; v, a
im.save('image_test/test_0.jpg')
g3 t" C$ v, U, z5 @$ }4 e' J im_90 = im.transpose(Image.ROTATE_90)
- M# f' x- k8 v# l: p im_90.save('image_test/test_90.jpg'), Y( Y' |! M$ n# w! e
im_180 = im.transpose(Image.ROTATE_180)5 {1 P7 H1 n: ^6 {5 x1 J
im_180.save('image_test/test_180.jpg')
4 ^* X5 w* T: e im_270 = im.transpose(Image.ROTATE_270)
) L% L- _1 I2 O0 J! ?7 [' H im_270.save('image_test/test_270.jpg')" W$ e8 _7 z: I) C
. t m$ X' C! G: p6 u5 a+ M
def plt_merge_img():
_5 r" K( d! @7 A #将保存的四种角度的图片,叠加在同一张画布上
7 d9 l' \ _1 `/ x #使用plt.figure()创建画布,并用add_axes()来分割区域显示图片
3 R: B; x( d5 G" w6 ?, o #显示画布,并将其保存为fig_size.png
' ?" ? q, y# x: W. `" Z7 e img1 = mpimg.imread('image_test/test_0.jpg')/ [& b# m& a& ~2 R, Y" R0 e
img2 = mpimg.imread('image_test/test_90.jpg')! V% @5 D& ^# i6 y3 n `& S, I* R
img3 = mpimg.imread('image_test/test_180.jpg')1 H" k, g8 ? x! Z' ?3 V @
img4 = mpimg.imread('image_test/test_270.jpg')
7 s& W% R+ F4 {# C" l fig = plt.figure(figsize=(60,59),dpi=96): _6 q) z2 `8 {) ]+ w
7 q2 @' D8 `8 h, p1 ~, t; o#上方的横图2 O# U4 i. z6 y# ^1 @2 z2 w! i
ax1 = fig.add_axes([0.30,0.55,0.42,0.28])" N q* D: W# N( p9 B0 [" [( z
ax1.imshow(img1)
8 [1 D# l) }: j% y: ^ ax1.axis('off')+ ~( Y* j5 z: i
) K9 m% l9 B. d" R" `4 h# 右方的竖图
; Y" `# C) z, T ax4 = fig.add_axes([0.67, 0.29, 0.28, 0.42])
3 L! V' A% x3 o& ? ax4.imshow(img4)
3 _& w9 X8 |: @; n, F ax4.axis('off')4 U5 m" n/ v8 l% v# C, E
, m0 `2 B$ H# I5 E* `9 Y
# 下方的横图
8 Y* X' u2 g9 u- @! S" d! g) r, [ ax3 = fig.add_axes([0.30, 0.18, 0.42, 0.28])% }3 M! _9 t h! g Z0 f0 O( t: K# `
ax3.imshow(img3)
( B) W. U) g6 u" p ax3.axis('off')% ^7 ]& o* f X6 _: f6 E6 H
6 T2 D' n' K& [ T, S$ t#左方的竖图
: t3 |9 M/ x: W3 L# v$ M ax2 = fig.add_axes([0.07, 0.29, 0.28, 0.42])! v5 p3 ^4 b, a% g. ]9 O/ q( ]$ p, @
ax2.imshow(img2)
: ]' g/ q* Y/ X) ]1 u ax2.axis('off')
& c: \; W- P" U( B I7 M! F" h # 保存为sig_size.png, P7 E- A& Q1 A) F
plt.savefig("fig_size.png",dpi=96)
* e }/ x6 c5 b' r plt.show()
, O1 M3 ]9 k, _' d
. b a7 a w6 Z1 {, O; K, f! A/ tdef main():
& u' ]3 ^- r Y: N9 ?. D5 X6 o url = 'test_1.jpg'
) e4 Y6 x, c$ g1 k rotate_image(url)* ?% E" J8 {% f9 Y p( O
plt_merge_img()
. k$ U$ s! |6 y. E
4 K8 ~- e. A. ]4 q" ] eif __name__ == '__main__':
, A! D: c2 M% O( K/ Z import warnings
0 ]4 ~1 ?2 G1 W8 N. N9 W warnings.filterwarnings("ignore")1 X; n# F* o, Q% R9 i+ [
main()2 z, b/ j& } g4 `
6 R2 A2 v' c' D# V
————————————————) q8 f1 K4 k4 W
版权声明:本文为CSDN博主「你要啥自行车」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。; M0 r! }+ A! V @+ _3 `. j
原文链接:https://blog.csdn.net/weixin_42572826/article/details/106033709) g+ p5 |' e) m2 g7 P# L, H
0 S9 H7 O% \7 z; G7 \6 B( p6 n* c! ^
# f. A) w* t( z& a0 }: C* _- g4 E8 s: ]6 p2 @- C
|
zan
|