数学建模社区-数学中国
标题:
python4次旋转图片后,多图叠加显示
[打印本页]
作者:
杨利霞
时间:
2020-5-10 16:27
标题:
python4次旋转图片后,多图叠加显示
, R3 }; \: `9 U# ?6 p c* R
python4次旋转图片后,多图叠加显示
' c; r5 w/ L% [# a
[color=rgba(0, 0, 0, 0.74902)]
文章目录
& W: [% l H+ d3 J# P
想要的效果对比,原图VS显示
问题
要点
代码
2 c6 q4 Y' r$ Z1 U
( Z, ?9 Z4 L4 }
! ~5 e4 k: g6 Y# J3 M' f/ {
[color=rgba(0, 0, 0, 0.74902)]
前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog
) k+ O" T. q. g* q- N d' M3 j
想要的效果对比,原图VS显示
2020-5-10 16:24 上传
下载附件
(76.02 KB)
2020-5-10 16:24 上传
下载附件
(76.02 KB)
7 ]. T, ~! J, N. h' h; M2 [
3 L" A. X9 m: Q$ M3 D8 ^. \; T# D
" |) b7 P \, m' M: s
问题
- D/ V+ C, V0 b! Y3 c
+ c5 v- D2 |/ c3 f5 F
(1)在刚写出来时,在rotate_image()函数中没有加,im = im.convert(‘RGB’)这句话,就会出现有的图正常,但是有的图报错,无法保存,并显示下面这句话
* V. {9 I" q/ I2 Y
2 X- B/ w: j8 n0 \
这个问题可以在这一篇blog找到解决方法。就是im.read(url)后,再将图片转换为RGB格式(image.convert(‘RGB’))。这样就可以避免很多因图片导致的问题
+ Y7 N9 G5 g; ?7 P6 {9 ]4 D
" c! k2 Q, u, `: ~
(2)在matlabplot中,显示图的第一步是创建画布,plt.figure(),然后在画布上添加子图,最后显示整个画布的图像时,并且让子图自适应来显示。而我遇到了这个就是关于self.figure.tight_layout()的警告,见下图。
% w, m `/ d+ R3 g
+ o7 _. s7 Z7 A
一般在使用plt创建一个画布后,程序本身会有一个自动调整子图尺寸来使用画布的情况,但是因为我是显示图片,所以这个自适应就出问题了。但是还好,只是警告,不是报错,为了方便,忽略就好…(但是我不推荐这种做法,希望有人研究一下,并把解决问题告诉我)
3 q5 W1 t% @. [# [5 I
为了方便,我直接在一开始加上下面这句,忽略掉。
2 y( [ B. A7 B% V
import warnings
" ?+ p# B& C6 g
warnings.filterwarnings("ignore")
- }4 i8 l9 _+ F9 r$ h
& v, j* z: h# ~
要点
8 }! m! u, }6 W: v6 @! |
7 u* o3 F, k" J0 x" D
1旋转图像现成的工具很多,一个是cv2提供的,主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图:
# N7 B/ w% {" ?; C; A! R
! u$ N, I( \' t& I
# \/ R- {1 P2 ?
2020-5-10 16:25 上传
下载附件
(368 KB)
2 d2 I- g) k# g# ?
B) W9 L) I: j' C7 g) I/ u; d8 P
这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。
8 A: c, z7 t" E: }7 B# t* f
& u' I3 Q8 C7 Q* C
这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图
( h/ K* h2 Q4 L' f/ i4 p7 i& l
7 E/ {1 e- I' D/ N
g8 I' u, H) ]* z4 f2 N
2020-5-10 16:26 上传
下载附件
(56.87 KB)
$ i. I0 X/ G. K% w Q7 {# N/ I; R
1 g* [/ O5 o4 @; G
代码
#! /usr/bin/env python
5 L; Q! Q- y. e) F& J
# -*- coding: utf-8 -*-
. v# g# L1 K* @. F' ], o: I
# ! python3
5 v* z7 I8 R4 g+ R
4 e$ Q% ?3 J1 i, J/ V) T
import cv2
3 a' r# d- J2 R' _3 ]1 X: o6 D$ v, b
import numpy as np
0 h. q% W! q! X& D$ ]% p4 l" Z
from PIL import Image
5 t w2 [) u* B
from matplotlib import pyplot as plt
+ H0 v+ ?9 U6 n! `6 D
import matplotlib.image as mpimg
- X; a0 r4 D7 ^+ w9 @
* H6 H; ]# x8 c! ]8 G& h1 u
def rotate_image(url):
) p7 I3 H) P/ J7 i& [
#旋转图像,并将其保存为4种角度的图片
5 J- {. V) M" A% H, }2 e5 P
im = Image.open(url,"r")
0 {; p% ?# n( O8 A6 e
im = im.convert('RGB') #避免有些图报错
( s) A( H5 S2 ~; d# Z
im.save('image_test/test_0.jpg')
6 T6 f" k# v: o7 s. g* g7 l: f
im_90 = im.transpose(Image.ROTATE_90)
; e# M* x/ _- s* L( {- P! ~$ A
im_90.save('image_test/test_90.jpg')
+ s! f M& z; M* W& j
im_180 = im.transpose(Image.ROTATE_180)
8 a, M ~! U; [. @% `; n9 o; n! E
im_180.save('image_test/test_180.jpg')
# y. O! x9 d w2 \! o
im_270 = im.transpose(Image.ROTATE_270)
3 y5 V$ y. A+ q( g, N# G
im_270.save('image_test/test_270.jpg')
7 { Q& r' h9 q- V% T9 d* M7 d7 c" h
5 n6 ~* n& Z$ Z/ G% f( g
def plt_merge_img():
. T' c* y% u, C. |; k1 \8 w- s: ]' e
#将保存的四种角度的图片,叠加在同一张画布上
1 \8 r3 F6 c9 A- n5 T/ e j
#使用plt.figure()创建画布,并用add_axes()来分割区域显示图片
3 x2 }8 C' ]. a/ [' Z! S
#显示画布,并将其保存为fig_size.png
0 I; { q$ |3 f+ Z
img1 = mpimg.imread('image_test/test_0.jpg')
2 b: ]; o. p2 \1 v; B1 Q8 p8 q' k
img2 = mpimg.imread('image_test/test_90.jpg')
& [/ f) a2 q' c9 K1 k7 T
img3 = mpimg.imread('image_test/test_180.jpg')
6 \7 q% L8 X% r- a8 J
img4 = mpimg.imread('image_test/test_270.jpg')
) g# C1 V" Z- E+ p8 J- A
fig = plt.figure(figsize=(60,59),dpi=96)
1 l* K* R5 z, f6 F# G
: w# d1 W% M5 W7 `1 n& p+ w: ^
#上方的横图
1 C2 ~5 C) q, ?9 Y2 N* @
ax1 = fig.add_axes([0.30,0.55,0.42,0.28])
2 ?$ j' F$ b2 q
ax1.imshow(img1)
0 ?* \6 }1 d3 x; C- j7 _
ax1.axis('off')
' F' r/ h' ~6 x; ]) X7 y
7 I+ D' C8 x: M) D" F
# 右方的竖图
! \' E$ o" }- ?
ax4 = fig.add_axes([0.67, 0.29, 0.28, 0.42])
! J. A9 h2 j: e( ? t- D0 g, p5 r8 J
ax4.imshow(img4)
T; a' q$ b: \
ax4.axis('off')
* O0 l4 \1 S1 d" ]$ J
- Z" C8 }7 f; d) N
# 下方的横图
3 z. j: o, ]) a9 @' y; h
ax3 = fig.add_axes([0.30, 0.18, 0.42, 0.28])
7 g3 o& N0 ]$ j7 x
ax3.imshow(img3)
! u1 R" E3 g/ |
ax3.axis('off')
! w' @! q. J u) D8 z% B
8 Y# }9 T$ P. H9 j- X
#左方的竖图
7 S% `& W1 N5 w
ax2 = fig.add_axes([0.07, 0.29, 0.28, 0.42])
' n: a- o5 J l1 {7 F/ Y
ax2.imshow(img2)
4 O1 K7 f% j! b+ f1 }
ax2.axis('off')
! W- w, a" h( I j6 g
# 保存为sig_size.png
# U3 c4 s. Z' t7 G
plt.savefig("fig_size.png",dpi=96)
2 K; O( O/ }( N* f
plt.show()
; d! b' t, q7 A/ U, U
2 c( w: a2 t P, U/ h1 f
def main():
9 [0 p0 W( B7 g9 h# o3 ^. r" u
url = 'test_1.jpg'
1 ], W8 R+ P; u7 j4 U$ r
rotate_image(url)
" a% Y( r1 \; I* G; U0 a
plt_merge_img()
' Y7 u W' r0 o
8 ^$ w- v0 s, }* u( D0 x* T
if __name__ == '__main__':
/ T) }" H Y; R' }6 F) I1 z2 f
import warnings
' {( Z% d) V5 l
warnings.filterwarnings("ignore")
$ R5 o" ^: Y+ e0 T5 T* C8 O5 m" ?
main()
- J. B( F! H* C5 c
5 \; y$ V: l: c. Z$ J
————————————————
. U9 Q. K0 M$ m
版权声明:本文为CSDN博主「你要啥自行车」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
" y% d2 l. z7 n
原文链接:https://blog.csdn.net/weixin_42572826/article/details/106033709
) L/ B; w& }9 c- `
$ Z$ v5 n6 k6 i9 ^0 e! S o' E
1 S" c; s7 j9 h
" H) y S+ @0 S, E" s
作者:
chace
时间:
2020-5-11 12:57
感谢分享
) d2 ?; K2 D6 L/ {& w
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5