数学建模社区-数学中国
标题:
python4次旋转图片后,多图叠加显示
[打印本页]
作者:
杨利霞
时间:
2020-5-10 16:27
标题:
python4次旋转图片后,多图叠加显示
( T( N6 h+ T3 ?* V( z8 K
python4次旋转图片后,多图叠加显示
& W' I+ ?( A4 D' k% v+ V, H
[color=rgba(0, 0, 0, 0.74902)]
文章目录
, `7 `% m) P! N$ C! f
想要的效果对比,原图VS显示
问题
要点
代码
v% f& K9 t" x* {* x
# K, B6 l* n9 z* V; s
. ^5 Z) g! |9 k _- W( R
[color=rgba(0, 0, 0, 0.74902)]
前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog
( B4 M* x! @' ?- w- K( P/ g
想要的效果对比,原图VS显示
2020-5-10 16:24 上传
下载附件
(76.02 KB)
2020-5-10 16:24 上传
下载附件
(76.02 KB)
1 F7 s& `: W9 t" Q% ]; X' y# [( v/ T
' g, k v" T+ p! p# v! F6 B
[/ U% n5 [6 f0 f
问题
2 b/ U8 V; H$ `$ q
: u% u0 @0 o& K: q: g' `
(1)在刚写出来时,在rotate_image()函数中没有加,im = im.convert(‘RGB’)这句话,就会出现有的图正常,但是有的图报错,无法保存,并显示下面这句话
7 `0 n7 C) b* H! D0 o7 [
1 O" ]- s1 u7 n4 S: U. H
这个问题可以在这一篇blog找到解决方法。就是im.read(url)后,再将图片转换为RGB格式(image.convert(‘RGB’))。这样就可以避免很多因图片导致的问题
3 N% s$ h3 ~( X& [: ]0 r/ U5 G
/ @* \$ {$ O+ ^2 ]7 x' T
(2)在matlabplot中,显示图的第一步是创建画布,plt.figure(),然后在画布上添加子图,最后显示整个画布的图像时,并且让子图自适应来显示。而我遇到了这个就是关于self.figure.tight_layout()的警告,见下图。
. u, C q# e6 t+ ]- r; X
, l& l- t' ?' V8 h. R0 J! |% G
一般在使用plt创建一个画布后,程序本身会有一个自动调整子图尺寸来使用画布的情况,但是因为我是显示图片,所以这个自适应就出问题了。但是还好,只是警告,不是报错,为了方便,忽略就好…(但是我不推荐这种做法,希望有人研究一下,并把解决问题告诉我)
. f+ `& G6 y! g) E! |+ j
为了方便,我直接在一开始加上下面这句,忽略掉。
+ i! E( W; J% H. ]/ m5 t
import warnings
8 A$ B! C& u% X: t" P6 G
warnings.filterwarnings("ignore")
3 S8 ^" A/ [* t e# u- h% ~" T1 `9 c
U( {! t& z) [/ L% y
要点
7 u3 b- ] c0 g+ d- o
: f# `; @# h& ~0 v. \' B
1旋转图像现成的工具很多,一个是cv2提供的,主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图:
0 A- i% M# O: @. q6 M2 F
( B- S! g* ^2 f; v6 i
; E8 q% z. p) g8 S7 ?
2020-5-10 16:25 上传
下载附件
(368 KB)
8 t$ n( Y5 d! N$ e4 e$ e8 {
1 H5 R" q: J" w! E
这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。
0 P" E. c( U7 _3 }- }, L2 j! t
) ~+ h5 k @8 l" \6 o: D! n
这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图
( I2 [/ ?) u* ^% R) e5 Z
( l3 j: U* U" s. h0 i1 Q; A* q
) p: J( e8 c4 B, ^! d: l0 {
2020-5-10 16:26 上传
下载附件
(56.87 KB)
# n8 e j/ H/ b. x7 n+ u$ `* i
5 T! G2 |0 {$ d$ Y7 y" m1 h
代码
#! /usr/bin/env python
3 D, W- Y, [9 i% d9 C. P1 v
# -*- coding: utf-8 -*-
: o- u) v! S7 ^! [; F+ Z$ t4 G9 b' |
# ! python3
/ q- u7 o" Z0 o
. ]. c; w( {7 Q
import cv2
5 J+ h' n! g+ }3 e5 T
import numpy as np
; ? X" Z8 U+ N# T( ^. W/ z: l
from PIL import Image
c( ^, x+ C0 E* D" q' a6 V1 q/ H2 Z
from matplotlib import pyplot as plt
* J7 Z! E' j4 L6 h* H7 b
import matplotlib.image as mpimg
* S0 Y3 }& ^$ N @4 w
0 ]. \, |8 l( ~8 B8 k. w" B
def rotate_image(url):
. F' i. }/ C5 w4 O+ D
#旋转图像,并将其保存为4种角度的图片
, L {, C0 U+ K1 w
im = Image.open(url,"r")
H/ c$ \* y- A3 N T
im = im.convert('RGB') #避免有些图报错
1 x; |- s( `; T' q4 U, @
im.save('image_test/test_0.jpg')
$ t3 S# _1 @, g' p
im_90 = im.transpose(Image.ROTATE_90)
8 B1 l& k6 H1 [# o, n+ R
im_90.save('image_test/test_90.jpg')
4 B& {; I/ r( r/ Q* X
im_180 = im.transpose(Image.ROTATE_180)
& w# R- d) L: c2 x4 V! H
im_180.save('image_test/test_180.jpg')
y0 H9 x" G# H9 M6 m& X. ?
im_270 = im.transpose(Image.ROTATE_270)
, d: E) C, v/ [. }9 T# p3 t/ {
im_270.save('image_test/test_270.jpg')
* m' S4 G, ~8 j8 k
0 M$ a, C5 e6 i6 \8 }, i7 o
def plt_merge_img():
# s n! q& }+ Y/ _. }! U- Q
#将保存的四种角度的图片,叠加在同一张画布上
6 z. x7 |* s4 F/ d$ \( F' e, b# U8 t7 E
#使用plt.figure()创建画布,并用add_axes()来分割区域显示图片
# F2 o9 r) E% Q' e' k
#显示画布,并将其保存为fig_size.png
8 a2 l$ ?' h3 e
img1 = mpimg.imread('image_test/test_0.jpg')
2 ?. m7 L, h' Y
img2 = mpimg.imread('image_test/test_90.jpg')
8 T$ S- Q) L* G. B6 G
img3 = mpimg.imread('image_test/test_180.jpg')
: y6 `& Y' D" Z
img4 = mpimg.imread('image_test/test_270.jpg')
) a9 | I# p2 O- e1 g
fig = plt.figure(figsize=(60,59),dpi=96)
/ V! M0 D( |) p- u' n
. o$ F& E0 h: \/ O% H( i* n$ {# [
#上方的横图
1 B/ L4 |" ?% v
ax1 = fig.add_axes([0.30,0.55,0.42,0.28])
- t) g- ^4 K/ K0 H& F, x% R
ax1.imshow(img1)
" A* m) g2 i- G6 a
ax1.axis('off')
- P% W7 r" b, c+ P, y
0 O) R E0 c' H6 J7 w( ^
# 右方的竖图
& _3 j, N* X% f5 U; W% {# @
ax4 = fig.add_axes([0.67, 0.29, 0.28, 0.42])
& k/ T: `+ [/ E3 J. k6 K w
ax4.imshow(img4)
' A+ i' a% z. e0 x# x
ax4.axis('off')
2 H) c% R" Z" v6 n2 f$ i* K
* j& B$ H% [& D9 F9 q
# 下方的横图
; p$ s* Q" @3 O7 G6 U- Q
ax3 = fig.add_axes([0.30, 0.18, 0.42, 0.28])
* }1 w; i1 K6 A2 s J
ax3.imshow(img3)
' \+ R9 B% A: I2 a% f+ D9 ]
ax3.axis('off')
9 H2 Y% q7 c% e4 j% r: ?
0 Y+ j( }. a; d* v* m
#左方的竖图
% L7 \) u8 H( q) J
ax2 = fig.add_axes([0.07, 0.29, 0.28, 0.42])
! }$ o9 |. Y9 ~* _. |
ax2.imshow(img2)
4 c }, ~' e6 r9 W9 s, k3 k
ax2.axis('off')
' I$ j6 C/ h6 H; v0 C1 a2 @
# 保存为sig_size.png
, V8 |! b" X/ M
plt.savefig("fig_size.png",dpi=96)
# `% t H7 [2 ?# @& i; _1 r9 w
plt.show()
/ L. m% B) r* T
( }% S5 o+ }$ {% F( w# n0 h
def main():
6 Y" u+ s; b& d5 P& D& ^
url = 'test_1.jpg'
) S7 ?' g4 n; S2 ?+ K4 F, L
rotate_image(url)
3 a0 f: f. D' m% U5 Y; n
plt_merge_img()
- E& S% ]% k- C1 O# b; b
3 `. \6 x- y5 J# P: }$ I; K1 f Z
if __name__ == '__main__':
1 v1 I5 l" u5 ~4 t
import warnings
! \ T% ^' y, i! ?' v% u
warnings.filterwarnings("ignore")
5 y$ z6 b0 e# N, M6 D7 v
main()
1 f9 ?- Y0 N! P0 P4 g1 I1 q
" f" m( r F9 m& Z7 P
————————————————
, }* P4 p# Z3 O5 m2 \$ C! y
版权声明:本文为CSDN博主「你要啥自行车」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
6 z, a' P9 D+ _/ l& W. v9 Z
原文链接:https://blog.csdn.net/weixin_42572826/article/details/106033709
, [8 _4 n* Y# Z3 B% N7 v0 N
# @; O/ O. V2 t2 w* z
* V* S1 U3 F0 ~1 o
+ {# M& M6 C! ?- q
作者:
chace
时间:
2020-5-11 12:57
感谢分享
9 j& n* n, L5 _, U- s
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5