数学建模社区-数学中国
标题:
python4次旋转图片后,多图叠加显示
[打印本页]
作者:
杨利霞
时间:
2020-5-10 16:27
标题:
python4次旋转图片后,多图叠加显示
; d8 Q4 V0 P( X4 Q
python4次旋转图片后,多图叠加显示
6 T2 W" x9 Z% d# Q% u7 r
[color=rgba(0, 0, 0, 0.74902)]
文章目录
( @$ ]* R2 F: n4 N- z ~# n7 [
想要的效果对比,原图VS显示
问题
要点
代码
+ p& R1 M( J2 b' O8 ?/ [5 G' T
$ n0 K( D& J) ` k& @* C8 B; V
2 N z7 C' u2 o8 e
[color=rgba(0, 0, 0, 0.74902)]
前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog
& _& \7 _$ V' t8 J
想要的效果对比,原图VS显示
2020-5-10 16:24 上传
下载附件
(76.02 KB)
2020-5-10 16:24 上传
下载附件
(76.02 KB)
+ g9 H- R O p" G) Q
6 J' `3 Q$ h! d2 d6 r5 }
& I& c) A# C" w
问题
" c5 n) `7 R' v/ m7 U
7 h% a1 E* p% i5 c' ^) ~
(1)在刚写出来时,在rotate_image()函数中没有加,im = im.convert(‘RGB’)这句话,就会出现有的图正常,但是有的图报错,无法保存,并显示下面这句话
$ \& ]5 D( p" F. `/ X* Q; E' X7 m
% I+ k2 M) L7 f- I& W
这个问题可以在这一篇blog找到解决方法。就是im.read(url)后,再将图片转换为RGB格式(image.convert(‘RGB’))。这样就可以避免很多因图片导致的问题
) s* T e( o# x. J
4 J' N! V# h: l7 |8 Z w4 P
(2)在matlabplot中,显示图的第一步是创建画布,plt.figure(),然后在画布上添加子图,最后显示整个画布的图像时,并且让子图自适应来显示。而我遇到了这个就是关于self.figure.tight_layout()的警告,见下图。
5 d4 [) S) @+ ?5 E1 x$ u
4 D. u) k( z9 a7 B
一般在使用plt创建一个画布后,程序本身会有一个自动调整子图尺寸来使用画布的情况,但是因为我是显示图片,所以这个自适应就出问题了。但是还好,只是警告,不是报错,为了方便,忽略就好…(但是我不推荐这种做法,希望有人研究一下,并把解决问题告诉我)
; [6 U$ g2 k3 v8 S
为了方便,我直接在一开始加上下面这句,忽略掉。
6 l* {3 Q7 b' b. E. f$ R- j
import warnings
2 _$ e1 _, l9 L6 e. Z
warnings.filterwarnings("ignore")
8 \" G/ B* i4 P5 [& t
. |" F* I; S& }" ^5 t1 s2 B/ ?
要点
/ ]0 L$ H% b* G: h1 ?/ P3 s
$ r/ E, Q m8 W2 _+ q! ^$ x
1旋转图像现成的工具很多,一个是cv2提供的,主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图:
+ f5 X! A1 D" m: f4 Q8 s; @
& [7 z0 D4 Z; J& w h L2 a! a/ S/ W
7 x/ V$ p1 Y, q) T
2020-5-10 16:25 上传
下载附件
(368 KB)
# P! M7 ?8 A$ K4 s2 w6 E
( P a$ F" M& ?+ t# u m! L3 ~) u
这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。
) |( e: C# p, I
1 C! E& d& f: _4 R
这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图
1 p( J, A( w4 Y' r/ p
% I0 @: \# Q3 ~$ }+ h
+ k/ N4 x3 M$ ^. ?7 D. r
2020-5-10 16:26 上传
下载附件
(56.87 KB)
( D# i! K9 I# R
" ^: e" D- I0 ~3 e7 u
代码
#! /usr/bin/env python
" ]7 T/ ]- F9 d; b4 N, j5 K
# -*- coding: utf-8 -*-
0 v. ^% ~& v. W1 t* T* {& K2 [0 ]
# ! python3
, i* ?8 A9 {+ J4 {7 G( } u$ X# k; `6 ?
. M3 L2 m, }6 ]
import cv2
' c1 E' o2 ]2 T9 p- e
import numpy as np
: F8 P- ]* H ~. \' I! n0 W
from PIL import Image
2 r7 i( I# b( B6 w! v% e
from matplotlib import pyplot as plt
/ l' A4 B v9 l4 ~
import matplotlib.image as mpimg
5 q# K6 E ?/ k
) r3 ^) m( L. B
def rotate_image(url):
" N( x7 M# l0 D3 W! Z) w, H
#旋转图像,并将其保存为4种角度的图片
; U9 } Z6 V! a M
im = Image.open(url,"r")
+ h$ Z( U4 A7 u" a! P2 B
im = im.convert('RGB') #避免有些图报错
' G7 g; }* L! I E" N
im.save('image_test/test_0.jpg')
) |' P& @% x0 p; V9 T7 I H7 C
im_90 = im.transpose(Image.ROTATE_90)
' T, C# y; {" H/ b
im_90.save('image_test/test_90.jpg')
7 i+ ^% k6 o2 c/ L0 _$ d& s
im_180 = im.transpose(Image.ROTATE_180)
& d$ M! |" `& _0 m7 e/ g
im_180.save('image_test/test_180.jpg')
* M R) K9 w: J; t
im_270 = im.transpose(Image.ROTATE_270)
G: a8 S# O8 @
im_270.save('image_test/test_270.jpg')
+ [- l, D6 {2 {* `. }
- A- h0 G k$ K' o
def plt_merge_img():
3 h& t' O$ y2 C7 i7 x: I
#将保存的四种角度的图片,叠加在同一张画布上
0 Q% N2 e9 H. _. W4 t
#使用plt.figure()创建画布,并用add_axes()来分割区域显示图片
/ w( f9 {7 ]6 N8 I! m8 w
#显示画布,并将其保存为fig_size.png
5 b, J$ ?# U& i0 I6 N) W$ _
img1 = mpimg.imread('image_test/test_0.jpg')
C$ [% Z" v! k1 z
img2 = mpimg.imread('image_test/test_90.jpg')
7 _$ x7 v* ]. W. y# F, a% e: N
img3 = mpimg.imread('image_test/test_180.jpg')
. O% M# s0 F. p. r5 b* W
img4 = mpimg.imread('image_test/test_270.jpg')
( ^: |/ r8 z" i% t5 h3 I7 V7 T; N
fig = plt.figure(figsize=(60,59),dpi=96)
1 K% s& |2 D7 B6 ?8 H
6 X' b$ T5 |4 A; |' C+ t' f9 y% O# [
#上方的横图
h" g# W8 \' R. I! j/ y0 j
ax1 = fig.add_axes([0.30,0.55,0.42,0.28])
' X$ X6 o$ V2 A0 [6 W. H
ax1.imshow(img1)
7 K' J0 H2 S/ B
ax1.axis('off')
5 n- l! c1 i+ F0 v& j5 ^4 v- K$ |6 ]! O
; e+ t- | k% R" h5 H9 l
# 右方的竖图
( x% B5 o p \5 E. `, a
ax4 = fig.add_axes([0.67, 0.29, 0.28, 0.42])
! R. a+ C; G, A4 E1 G
ax4.imshow(img4)
, W1 t- O: A$ {: N* M% N
ax4.axis('off')
% z3 @% N1 ?; K6 `) I4 a' k) l+ v
# f9 d4 d* P# j
# 下方的横图
8 L7 @6 e! b) Q+ a5 @
ax3 = fig.add_axes([0.30, 0.18, 0.42, 0.28])
+ C% a. x' c- N( y, B
ax3.imshow(img3)
( V) ]1 j/ L! j
ax3.axis('off')
1 I8 y( Z$ S/ @# h* k8 m
* \$ a/ L0 q+ a' w4 p" w
#左方的竖图
! Y) ^0 S9 B. A: A" r! \7 }
ax2 = fig.add_axes([0.07, 0.29, 0.28, 0.42])
% S0 q" r5 C2 H: Q" g* n# F: D
ax2.imshow(img2)
$ k( M5 j6 s5 O P
ax2.axis('off')
" n1 _ O+ I5 g) }% R
# 保存为sig_size.png
9 o+ g" x7 i/ G, b7 Q
plt.savefig("fig_size.png",dpi=96)
3 a; c9 ~8 c1 c1 w
plt.show()
: E& E) `" F& @" X8 E
7 ~5 o% B& g6 X) l' }2 p
def main():
6 d, e7 C2 Q+ h
url = 'test_1.jpg'
) ^, P; y% u4 v. e5 K' x
rotate_image(url)
. E( q4 m J; j3 R# C
plt_merge_img()
9 z X% d, S7 }1 ?
7 J& p. {, @( _) D# z9 Z1 ^
if __name__ == '__main__':
% S4 h3 ^7 r, c1 ]' m
import warnings
% Q" k4 o5 L9 v6 l
warnings.filterwarnings("ignore")
# o) ?& l, u" o+ K
main()
$ R2 F u( w6 m. k; s: n+ E
# v' H6 ]6 Z$ q! B) a h; g4 Q G
————————————————
1 V; C. T9 V7 t3 Z8 p1 j+ N
版权声明:本文为CSDN博主「你要啥自行车」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
5 H* {! W( g8 s' [8 r# o
原文链接:https://blog.csdn.net/weixin_42572826/article/details/106033709
4 K6 e1 H3 ~# v& I
6 u5 v9 G" n" s% Z7 g/ [
7 x6 @% m4 L& K& E l
, e5 P$ K. t* T& K5 _* _
作者:
chace
时间:
2020-5-11 12:57
感谢分享
2 w& j7 c% V. J( w* s/ d F. e
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5