在线时间 1630 小时 最后登录 2024-1-29 注册时间 2017-5-16 听众数 81 收听数 1 能力 120 分 体力 541051 点 威望 12 点 阅读权限 255 积分 167694 相册 1 日志 0 记录 0 帖子 5324 主题 5250 精华 18 分享 0 好友 163
TA的每日心情 开心 2021-8-11 17:59
签到天数: 17 天
[LV.4]偶尔看看III
网络挑战赛参赛者
网络挑战赛参赛者
自我介绍 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
群组 : 2018美赛大象算法课程
群组 : 2018美赛护航培训课程
群组 : 2019年 数学中国站长建
群组 : 2019年数据分析师课程
群组 : 2018年大象老师国赛优
5 W% C! S0 a. q
python4次旋转图片后,多图叠加显示
; o* F+ M o9 n' k& R4 F6 s [color=rgba(0, 0, 0, 0.74902)]文章目录
& _( f6 x7 @6 `" K5 ]& |0 N5 @/ D 想要的效果对比,原图VS显示 问题 要点 代码 . C# b+ z3 N7 {3 w8 L
9 Z5 u" O$ h; a% i D4 O! ^8 m
" d1 d+ S( {1 z$ |9 m3 \
[color=rgba(0, 0, 0, 0.74902)]前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog ! Q8 P1 b' G6 @
想要的效果对比,原图VS显示
3 Y! T# X% N: F0 j ; H% |5 e) o y1 j% H- y3 G6 U1 j
" R: h/ Z5 \. I9 H1 J 问题
- Q' m- o$ v; ?2 R1 v7 I; t
$ F5 c2 C2 z! W5 w- _ (1)在刚写出来时,在rotate_image()函数中没有加,im = im.convert(‘RGB’)这句话,就会出现有的图正常,但是有的图报错,无法保存,并显示下面这句话
* i4 Q$ n( R/ M% w+ v$ z3 r # P6 P& t7 w/ y& w7 N
这个问题可以在这一篇blog找到解决方法。就是im.read(url)后,再将图片转换为RGB格式(image.convert(‘RGB’))。这样就可以避免很多因图片导致的问题
5 M& s1 ?' u/ ]$ @- [% f 6 _5 l: F# t8 c
(2)在matlabplot中,显示图的第一步是创建画布,plt.figure(),然后在画布上添加子图,最后显示整个画布的图像时,并且让子图自适应来显示。而我遇到了这个就是关于self.figure.tight_layout()的警告,见下图。2 |+ N* y% O& L( ]
: X$ ~' W1 ~) M* j 一般在使用plt创建一个画布后,程序本身会有一个自动调整子图尺寸来使用画布的情况,但是因为我是显示图片,所以这个自适应就出问题了。但是还好,只是警告,不是报错,为了方便,忽略就好…(但是我不推荐这种做法,希望有人研究一下,并把解决问题告诉我)
; F8 q1 ~, d& T% v( ~3 H 为了方便,我直接在一开始加上下面这句,忽略掉。
- b2 f) w* ?# X import warnings+ d+ Q8 I. l, M, K j) I
warnings.filterwarnings("ignore")7 |2 Y: ~. j/ }( V: w
3 ?: h) s+ s0 z
要点
' J! }! e4 [3 m3 z / e" w9 N5 [0 N! P
1旋转图像现成的工具很多,一个是cv2提供的,主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图:
4 |1 j& g! J7 A. I& z1 W5 y$ \ 2 {# |( K7 H$ @9 n. i+ w
/ i3 P8 _2 q2 z& c! ^
% p6 {0 N. l! q, F5 }6 @0 e4 v $ R- T+ b0 Z# Q Q
这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。
* O A! o! Y. R% |
1 x P2 |6 U% Z! w; d( [& Z3 M% h 这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图0 [) H' M$ L. {, ?* c' Z) s
0 o) o8 I& o& O
1 j: d# U; @$ s' E+ L4 ` c' ~) s' f
) E0 w+ X c! c) S8 `
8 |, m1 a/ ]1 q3 I2 s, H! m
代码 #! /usr/bin/env python# o* k U+ U U, X
# -*- coding: utf-8 -*-, ]" _3 |2 Z: `4 W
# ! python3
; |- U3 N* z6 R2 S4 _# I : O4 G" r; g7 E# y
import cv2
) S. c+ q5 C$ s8 V ` import numpy as np
6 m6 o+ `) f9 \7 O from PIL import Image8 i; y3 ?2 Q; o: M: Q
from matplotlib import pyplot as plt% n+ z: p# J' { f- w7 Z* ]
import matplotlib.image as mpimg9 r- i; I5 f; Y/ _. M2 R
: T8 ] C+ C( u$ J& G$ F) |9 r
def rotate_image(url):5 K! s# a6 [0 R6 s4 c( V& V
#旋转图像,并将其保存为4种角度的图片$ k/ ?8 o7 }+ i+ J1 N& ?& |0 t
im = Image.open(url,"r")
! I) F1 j, N4 Q, B) D% t im = im.convert('RGB') #避免有些图报错 1 b' e4 {/ B7 P$ r
im.save('image_test/test_0.jpg')
! r+ S6 B: S7 u# } im_90 = im.transpose(Image.ROTATE_90)
, p0 P/ Q, w0 t4 s8 E4 g+ W im_90.save('image_test/test_90.jpg'), K4 O+ `* N/ S9 `! |
im_180 = im.transpose(Image.ROTATE_180)
% V$ P' N* p- a3 s( }& O im_180.save('image_test/test_180.jpg')7 P9 e& A5 z# W0 }2 @
im_270 = im.transpose(Image.ROTATE_270)
0 ~1 ?9 N2 w6 q& G7 h/ q! p! ^5 Z im_270.save('image_test/test_270.jpg')% e8 B& l1 {5 z3 ?" f* F& ^! z
+ ~, D- s$ t& i' N7 f1 F def plt_merge_img():
' Z, N& e- c; v4 e1 `6 { #将保存的四种角度的图片,叠加在同一张画布上3 j- [$ }! Y' E( Z5 k0 O0 J
#使用plt.figure()创建画布,并用add_axes()来分割区域显示图片
% e7 A i7 f% s' O6 O, P; ` #显示画布,并将其保存为fig_size.png
' Z6 F' c6 q& P+ F$ ^ img1 = mpimg.imread('image_test/test_0.jpg')
! w4 R" J( L* i- _2 } img2 = mpimg.imread('image_test/test_90.jpg')
0 t7 N% m* o' q! {! {# M* R img3 = mpimg.imread('image_test/test_180.jpg')
7 B& C: _5 T' J6 u' r- Y' x! E img4 = mpimg.imread('image_test/test_270.jpg')0 J6 R9 j2 V/ {5 N* S: _
fig = plt.figure(figsize=(60,59),dpi=96)5 f) O N' f+ F
" [, Y: K+ `6 L #上方的横图
]. `9 G9 \; h( U+ u: p" V ax1 = fig.add_axes([0.30,0.55,0.42,0.28])+ e* k' b6 p" q1 ?" ]4 M& H
ax1.imshow(img1)
( t( \& C8 ]% @7 E$ O7 j ax1.axis('off')
& O& {- X- C) [( ]+ d
! m2 F ?: V0 H" K- h # 右方的竖图
6 J0 C! o3 ?; K3 ?* m1 G6 e/ d ax4 = fig.add_axes([0.67, 0.29, 0.28, 0.42])$ s2 D( A' E1 g2 S
ax4.imshow(img4)
+ n2 k' D$ G$ o3 B2 z! X4 ]9 H ax4.axis('off')
4 U1 V3 r4 a; M 6 h7 O1 v% ? G9 P# R
# 下方的横图
3 S4 j4 ~. I7 Q/ W ax3 = fig.add_axes([0.30, 0.18, 0.42, 0.28])
! J& h5 r T3 V% |: @ ax3.imshow(img3)" x3 e. t0 k D* F
ax3.axis('off')
3 _8 Y. ?& e- T. I- ^
- N! z/ P- r S4 R3 Y( f #左方的竖图4 Y1 d7 \; X+ g. Y
ax2 = fig.add_axes([0.07, 0.29, 0.28, 0.42])/ G7 X0 G u: `6 q
ax2.imshow(img2)& B. S5 j4 P6 q
ax2.axis('off')
w1 u8 A* `: h+ C* w # 保存为sig_size.png3 I" W$ c# s, t x- d# K
plt.savefig("fig_size.png",dpi=96)
: n3 h( R) ?7 I) l0 E, ^ plt.show()
5 E+ Z6 r( A: D3 I& M, V# b, c
& b! Z& i I& w; ?; C% e& N def main():
. K6 E, L% z# d4 \ url = 'test_1.jpg': Y; E$ ^6 G2 G# ^2 o
rotate_image(url)0 @3 X) } ~$ ~% y/ `4 V& T ]
plt_merge_img()
4 c: p* d" O, _: l
3 o$ W- _4 z- P7 z0 c' q$ r J5 q if __name__ == '__main__':
7 a& |3 K% n: j import warnings
2 l, p+ t: R' Y) i2 x) f5 o warnings.filterwarnings("ignore")/ Y0 S. y' K' ]1 b
main()
3 o2 i" r! ?8 w" {0 w
/ F% R1 W$ x' W0 X3 z; ^ ————————————————8 t2 l: Q! g7 S
版权声明:本文为CSDN博主「你要啥自行车」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
* _; ~" B3 a$ @) C" O" I 原文链接:https://blog.csdn.net/weixin_42572826/article/details/106033709# B* @) M" u9 `+ A+ p1 U; i
) i! d, ^- f2 w) H
0 O; n! t9 M$ w" S( O2 a9 e- V$ z 1 S* z$ k: f1 @0 m& [) G3 B
zan