在线时间 1630 小时 最后登录 2024-1-29 注册时间 2017-5-16 听众数 82 收听数 1 能力 120 分 体力 565556 点 威望 12 点 阅读权限 255 积分 174890 相册 1 日志 0 记录 0 帖子 5313 主题 5273 精华 3 分享 0 好友 163
TA的每日心情 开心 2021-8-11 17:59
签到天数: 17 天
[LV.4]偶尔看看III
网络挑战赛参赛者
网络挑战赛参赛者
自我介绍 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
群组 : 2018美赛大象算法课程
群组 : 2018美赛护航培训课程
群组 : 2019年 数学中国站长建
群组 : 2019年数据分析师课程
群组 : 2018年大象老师国赛优
1 ^9 Y; b( f9 t6 V. @+ `0 E
python4次旋转图片后,多图叠加显示
# b5 f% B, j; t# r4 Z1 b c [color=rgba(0, 0, 0, 0.74902)]文章目录
2 T! _; M3 h5 r6 F, ^2 V 想要的效果对比,原图VS显示 问题 要点 代码 0 P& |$ S. n9 f4 g! @$ M
% g* {' C7 X' }/ f) T
, l( o( M- l2 q) e1 u* {
[color=rgba(0, 0, 0, 0.74902)]前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog
' k9 H3 w4 W' w$ x; e7 r 想要的效果对比,原图VS显示
5 G4 [- ^- \$ z$ \: `+ r$ K- w0 O % H! f5 D" y z, O
; i* b, B/ z# ]$ p& d
问题" T8 x# p# Y% b0 g9 B1 }- x; X0 c
3 a! D/ L F( A; Z2 _. I S (1)在刚写出来时,在rotate_image()函数中没有加,im = im.convert(‘RGB’)这句话,就会出现有的图正常,但是有的图报错,无法保存,并显示下面这句话
9 M7 W" y+ ^: b" Y
$ t0 j4 Q" x0 [! u4 D 这个问题可以在这一篇blog找到解决方法。就是im.read(url)后,再将图片转换为RGB格式(image.convert(‘RGB’))。这样就可以避免很多因图片导致的问题
9 r, |' N. ^/ S& h$ s# { 1 o; g4 I2 q9 O
(2)在matlabplot中,显示图的第一步是创建画布,plt.figure(),然后在画布上添加子图,最后显示整个画布的图像时,并且让子图自适应来显示。而我遇到了这个就是关于self.figure.tight_layout()的警告,见下图。
/ v1 J: e( J" B9 H* z& Y : L/ K2 X) R7 h+ M
一般在使用plt创建一个画布后,程序本身会有一个自动调整子图尺寸来使用画布的情况,但是因为我是显示图片,所以这个自适应就出问题了。但是还好,只是警告,不是报错,为了方便,忽略就好…(但是我不推荐这种做法,希望有人研究一下,并把解决问题告诉我)$ d6 p4 ~& V* Q$ O/ e/ x8 i- k0 r
为了方便,我直接在一开始加上下面这句,忽略掉。8 i7 {7 y. K1 z& r1 @2 C
import warnings
% N5 K5 ^% f! t. ~ warnings.filterwarnings("ignore")
h7 C3 b8 |( l+ R
# |# z" q- J" w0 O) d) v+ p 要点
. d+ x1 ^- r3 H F' W8 Q' `
- M) A- h/ u/ d 1旋转图像现成的工具很多,一个是cv2提供的,主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图:+ ~5 B- V3 G. F# y' y* Z0 P/ m
* o- o+ J2 A* K
6 S) E# v( N7 n. [: z
6 c) P) S% f k. j; K / e0 }2 m; v ?5 q
这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。% N1 N$ g: }8 X5 A
9 W: H9 J- _ {( p- H4 n6 d
这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图: [: y+ v1 F7 J/ ?1 D
& K2 I' C% k0 L# b
; ]+ P* C! I9 U: S7 K {, k
# Z! }4 |0 d0 c9 }' }$ a 2 V: }) ?9 g/ `9 N# P
代码 #! /usr/bin/env python
+ B# A% _5 s! g2 o; L3 Y # -*- coding: utf-8 -*-
% C- S a* q, ^: O; } # ! python3
5 s% n8 k) w+ U/ `2 M 3 Q- ^, ]6 Z+ c) g3 w" I7 b
import cv2
: z: T0 O$ }4 U/ z; u- } import numpy as np- }8 d8 Q* {) U0 n/ F
from PIL import Image7 }' t. W! D8 L; |* Q
from matplotlib import pyplot as plt
7 T7 i* N, L- X import matplotlib.image as mpimg* e( C8 v+ o3 |. {0 n! i
' m1 e' k" i2 m# ^ def rotate_image(url):
+ d6 |8 b& W# M1 s+ o( ~! ^ #旋转图像,并将其保存为4种角度的图片
0 ]& a9 p' d* T, U$ Q2 X3 v im = Image.open(url,"r")' [! Y" r/ X% w4 ]& D- J
im = im.convert('RGB') #避免有些图报错
& t2 r. O$ d% R* p. c8 e: Q+ Y im.save('image_test/test_0.jpg')
, l a9 Q( M$ ~( v- q) k7 ` im_90 = im.transpose(Image.ROTATE_90)
0 I7 B0 j+ {6 w) T2 i im_90.save('image_test/test_90.jpg')8 ^4 z4 D! v2 D$ t) j4 P
im_180 = im.transpose(Image.ROTATE_180)/ u+ C& R0 w0 B; M2 A1 Q( o! H
im_180.save('image_test/test_180.jpg')
9 \+ j! k8 W7 G; S+ j6 Z0 J im_270 = im.transpose(Image.ROTATE_270)- G: v) C4 `7 y2 `4 }2 W* s
im_270.save('image_test/test_270.jpg')
, I( o& |" b0 @2 E5 q# c) ]1 R( M# `
; \7 f/ M5 X% C+ L( @& `) t def plt_merge_img():6 Z2 H" b$ _( P, z
#将保存的四种角度的图片,叠加在同一张画布上
* ~/ B8 T7 e0 V: t$ f1 O7 C #使用plt.figure()创建画布,并用add_axes()来分割区域显示图片
3 ^$ N: M; o( ?: B+ k #显示画布,并将其保存为fig_size.png
4 r$ U0 i: G( W& a3 I& A5 O img1 = mpimg.imread('image_test/test_0.jpg')
9 A7 P" }( Z9 M- { img2 = mpimg.imread('image_test/test_90.jpg')
- H+ U7 X! N5 A$ T% _ img3 = mpimg.imread('image_test/test_180.jpg')5 b) @( v3 U1 U# m8 \) V" u& x
img4 = mpimg.imread('image_test/test_270.jpg')5 k2 ?( U) i6 N* C* U8 p# U6 K
fig = plt.figure(figsize=(60,59),dpi=96); J6 p$ A2 G/ c8 }
+ I5 O+ Y0 v) o9 `) W #上方的横图! R/ V7 \3 I1 I ? |% K! |; B
ax1 = fig.add_axes([0.30,0.55,0.42,0.28])
5 \( Z; A$ H( @8 H1 [. K ax1.imshow(img1)' I3 Q* C; N; d
ax1.axis('off')
) q Y" }2 X9 Y! b , R& w. ]" ]3 g* ~
# 右方的竖图1 @9 S. m5 |, \* C" w
ax4 = fig.add_axes([0.67, 0.29, 0.28, 0.42])
$ C' r6 t+ V5 t ax4.imshow(img4)
( o& n7 d; o- A( O3 N+ U ax4.axis('off')
$ }0 G6 p: ?* }, q* m9 b' n
4 K1 ^- V) `9 Q- V8 O # 下方的横图) M& w [1 y" G( `
ax3 = fig.add_axes([0.30, 0.18, 0.42, 0.28])
) A; z7 R# i, f+ K ax3.imshow(img3)
; Z4 T8 @ e3 q2 u: { ax3.axis('off')& j; t0 s6 S9 r- q1 O: A& e `3 {
# I' }( t7 S# x/ f+ C$ p- \
#左方的竖图+ ?- d& A, t; J! M3 K
ax2 = fig.add_axes([0.07, 0.29, 0.28, 0.42]), W: e6 `4 N$ j/ V/ g' m* a
ax2.imshow(img2)
$ M# u8 H8 J6 a- S7 b ax2.axis('off')
' W' ~" q9 f3 y! \ # 保存为sig_size.png
6 @1 C0 S1 x, O plt.savefig("fig_size.png",dpi=96)+ Q) E+ p. b3 G" S2 ?
plt.show()% \1 E+ J0 ~* X! {9 _; Y i
$ Y4 L' f; b3 j def main():
" m! X4 d# {+ I/ c url = 'test_1.jpg'7 f: z3 e! Z j: L. F
rotate_image(url)
& k/ ~# O7 B' {8 g# |, J$ c, g C2 _7 G plt_merge_img(): e% S1 i0 F7 ~/ B
. s* D- X4 S% c3 R# Q9 M
if __name__ == '__main__':, B+ f, O1 m# V
import warnings
7 b3 Q1 y0 w9 }4 J8 D1 R& k warnings.filterwarnings("ignore")
% @ g7 \7 o+ Z3 G; s2 K z main()* d$ a: h3 p, R. b0 r3 ^+ M
, }& f) z- y, k# [+ K+ f6 r
————————————————2 V6 g% s) b5 i& Y
版权声明:本文为CSDN博主「你要啥自行车」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。" E( R6 I5 [ W# i
原文链接:https://blog.csdn.net/weixin_42572826/article/details/106033709. \0 X3 {1 I. b7 Z4 y
2 U# |- c& k0 C* J% K 5 m! e0 `5 r- j+ q5 e- C
; o2 X* V. C1 z G, a* f; _
zan