数学建模社区-数学中国

标题: 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)]文章目录
# 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显示 1.jpg 1.jpg 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 warnings8 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 ?
3.png
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 {
4.png
# n8 e  j/ H/ b. x7 n+ u$ `* i5 T! G2 |0 {$ d$ Y7 y" m1 h
代码#! /usr/bin/env python3 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 cv25 J+ h' n! g+ }3 e5 T
import numpy as np
; ?  X" Z8 U+ N# T( ^. W/ z: lfrom 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 bimport 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 k0 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; b3 `. \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