数学建模社区-数学中国

标题: python4次旋转图片后,多图叠加显示 [打印本页]

作者: 杨利霞    时间: 2020-5-10 16:27
标题: python4次旋转图片后,多图叠加显示

) ]: F+ F( U1 i. X% f5 Kpython4次旋转图片后,多图叠加显示* M/ g9 g6 A+ r" U
[color=rgba(0, 0, 0, 0.74902)]文章目录
! t: u9 U: z7 L6 n7 U2 D; i
4 H) K7 B' C' T4 t; x[color=rgba(0, 0, 0, 0.74902)]前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog
# d& H' k. N+ m" t. d" l. Y/ X. r想要的效果对比,原图VS显示 1.jpg 1.jpg 1 x+ m$ F) I9 Q. a
9 P  Y5 [% ~' R; `2 l6 k: I' n
6 h) }$ ]1 s- l* R
问题
3 a7 {) J( }; K3 W( Y: W
2 K2 K  w% R. B& _- D. w0 O(1)在刚写出来时,在rotate_image()函数中没有加,im = im.convert(‘RGB’)这句话,就会出现有的图正常,但是有的图报错,无法保存,并显示下面这句话
5 J" l6 o# ~4 B0 ^; N4 i9 W8 p& _
& H9 e$ x' E+ H" v9 Q5 O" c这个问题可以在这一篇blog找到解决方法。就是im.read(url)后,再将图片转换为RGB格式(image.convert(‘RGB’))。这样就可以避免很多因图片导致的问题7 g/ V! F4 C( @, ]' Z7 W2 k

- N8 s+ Y  s- K% \(2)在matlabplot中,显示图的第一步是创建画布,plt.figure(),然后在画布上添加子图,最后显示整个画布的图像时,并且让子图自适应来显示。而我遇到了这个就是关于self.figure.tight_layout()的警告,见下图。8 d; B+ W* x, i& L+ q
# K- d6 Y( z* _3 A
一般在使用plt创建一个画布后,程序本身会有一个自动调整子图尺寸来使用画布的情况,但是因为我是显示图片,所以这个自适应就出问题了。但是还好,只是警告,不是报错,为了方便,忽略就好…(但是我不推荐这种做法,希望有人研究一下,并把解决问题告诉我)
: A! Z2 E1 a/ T6 Q) O# x% o为了方便,我直接在一开始加上下面这句,忽略掉。# n7 Y+ [8 i: D; O. Y* r
import warnings+ P+ h  w: c; P0 }. o9 Z9 v- N. i
warnings.filterwarnings("ignore")
1 R8 g5 @+ r* x' v' u
; I/ l. c( h( L+ \( \# p, H, ?+ i要点
1 i2 k! \4 S8 i+ m5 x1 Q# I9 _3 b" T0 E5 Z- H
1旋转图像现成的工具很多,一个是cv2提供的,主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图:  t* b6 L/ f! ~" Z5 J- W
2 @) m3 U2 H/ A( `$ R- Q

5 s& E# |! y5 ^/ h 3.png   L0 Y. t0 K3 _" V" D8 {, O4 Q0 u3 P
  h" y; n; _% e7 X# r1 w) R' ?
这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。6 g8 K& h. G6 l  T4 Z
( d  E% |5 N* [1 I; p
这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图6 h5 z" J. l) e

+ r- I3 b+ x/ J; y7 e" j4 v2 ~1 u# @1 W3 ~8 p1 n, [
4.png 7 p4 ~, P0 `! G0 J! {

* C$ j4 t* I6 `. c1 X8 ]' S代码#! /usr/bin/env python
$ O/ v% ^" v& s4 t) |; g. o! m/ J# -*- coding: utf-8 -*-
$ i/ V' d* p; `* B/ i# ! python3
+ ~' ~; s7 @, ]& `% H# \) u& L. R7 X2 U! p3 n
import cv2" S; i6 f/ o" o% L! g) s
import numpy as np: h: K9 ~- i$ R" C5 g' N3 _( H
from PIL import Image) q' [! V6 f$ Z2 d$ I$ k
from matplotlib import pyplot as plt
8 [/ w4 U3 |" J. Q& B# Uimport matplotlib.image as mpimg' ~+ `- M5 ~, D2 d0 I! \
! a9 e1 g- P7 B" N3 g+ F5 G
def rotate_image(url):
# j4 c3 ~$ ]! P9 `5 X# s( h        #旋转图像,并将其保存为4种角度的图片
" n. _6 ]5 v. \/ q) j    im = Image.open(url,"r")
3 t$ ^* \9 o7 c( U) \& j7 c/ E2 Z    im = im.convert('RGB')  #避免有些图报错
# \% M4 A$ v: G) Y! Y: {. |0 B3 j    im.save('image_test/test_0.jpg')% S/ A  f6 N8 S
    im_90 = im.transpose(Image.ROTATE_90)
( C; W/ ]' R: R    im_90.save('image_test/test_90.jpg')* t8 [1 Q  U' X: K+ S
    im_180 = im.transpose(Image.ROTATE_180)7 ^7 n& ]3 @4 n% a; C
    im_180.save('image_test/test_180.jpg')
. G( d  }; l- I5 f/ o2 ^+ ?    im_270 = im.transpose(Image.ROTATE_270)
( j6 j4 F0 G( e! W% x) [5 Q6 S# i& k! k6 N    im_270.save('image_test/test_270.jpg')+ g! @: @2 N  m! U
) g5 T4 f" e# S
def plt_merge_img():" d  |6 y& U' {5 q2 p+ T! {8 `* }
        #将保存的四种角度的图片,叠加在同一张画布上! e" q+ ?* ~8 f
        #使用plt.figure()创建画布,并用add_axes()来分割区域显示图片
+ p& W7 Y) P1 j6 m        #显示画布,并将其保存为fig_size.png
3 k% J! K" L5 e  t! f    img1 = mpimg.imread('image_test/test_0.jpg')
2 h8 x( b1 }. F) M% f% M    img2 = mpimg.imread('image_test/test_90.jpg')) W+ O# Q/ j! }7 I4 J6 n1 _. s+ |
    img3 = mpimg.imread('image_test/test_180.jpg'); ]3 W4 Q2 U7 [) |
    img4 = mpimg.imread('image_test/test_270.jpg')
6 ^6 g$ T; `" M9 H6 I    fig = plt.figure(figsize=(60,59),dpi=96)
6 m! |  T0 q$ s4 s+ |) q
- T" p5 ]+ A% K$ n- \: k9 z# I4 P#上方的横图, ~1 q/ |1 |* }6 k/ Y
    ax1 = fig.add_axes([0.30,0.55,0.42,0.28])
4 g, C$ P- k; D    ax1.imshow(img1)0 z5 q4 ~. J' B7 V  D5 V
    ax1.axis('off')
  {7 c, W/ q6 _8 Z: Y' y9 M
" f/ S& F) a3 V  _+ \- t# h) }  G7 t: @# 右方的竖图" B1 u+ {. B3 ?
    ax4 = fig.add_axes([0.67, 0.29, 0.28, 0.42])* `; g. r+ f4 f% ~0 `9 \" C7 @
    ax4.imshow(img4)
8 s  r; f% B9 d2 Y7 C( @6 M' D" j    ax4.axis('off')) b( o3 I0 P1 N" A9 R

; @. }; P4 O+ ^0 C7 ^/ X  Y1 ?# 下方的横图9 r2 R. B7 |  \& B' w+ K
    ax3 = fig.add_axes([0.30, 0.18, 0.42, 0.28])
# z% B* [+ C: s9 f9 q* w    ax3.imshow(img3)
7 u3 d0 o. x' a6 p) D5 _0 B    ax3.axis('off')
5 d& R  Z5 c! e3 l1 `% s! S5 f- W+ T, k7 X1 X  e7 A
#左方的竖图. j9 \8 R- L+ B. u  J
    ax2 = fig.add_axes([0.07, 0.29, 0.28, 0.42])  U) U4 T  f" U6 {8 t) S
    ax2.imshow(img2)
6 b7 |, v6 t0 P6 n) i    ax2.axis('off')# u- S0 a' |  ]$ N+ X
    # 保存为sig_size.png1 S* P) X0 S) G$ j; H$ {; U
    plt.savefig("fig_size.png",dpi=96)/ T& J8 t4 p$ r# j, I) h
    plt.show()% j! f7 S+ T& _& F
! @4 X# p, d! i: p0 ~4 g
def main():
8 `( O8 ~9 j8 \( W3 m; u+ z    url = 'test_1.jpg'
" U% m5 p$ M( V  e0 P! r* F    rotate_image(url)7 S5 F/ w- P6 U1 M9 l  U. c( h2 Z
    plt_merge_img(). W" u: T* ]/ Z0 |: {. {! N
  Q1 m; F1 y# M1 `
if __name__ == '__main__':& t0 e1 C9 \6 i* m
    import warnings
/ p( k$ y1 [5 h" k: [0 F  {    warnings.filterwarnings("ignore")
  W! L; T+ l" r# z, n; b# O    main()1 h! k" q5 _  M. t$ o) M
6 M1 {# T5 O9 B) r& n  E$ ?/ M) K$ R
————————————————( q. r& g; `& `! q6 u$ v; k' a
版权声明:本文为CSDN博主「你要啥自行车」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
. _/ R9 F/ ]  b" K( c8 |  U原文链接:https://blog.csdn.net/weixin_42572826/article/details/106033709
  |, U; t$ U3 W8 D8 `
# p: s/ U+ H7 e) F, w* F
* C2 u# x: p* O& S/ C, ~6 Q) R( Z8 C9 j& C

作者: chace    时间: 2020-5-11 12:57
感谢分享
6 f& k- M, W" q! l8 h% P




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5