数学建模社区-数学中国

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

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

# k! o: v& R$ B0 i, fpython4次旋转图片后,多图叠加显示2 g% r5 C, E; Q6 n7 g' I
[color=rgba(0, 0, 0, 0.74902)]文章目录7 o, ~9 X* d! r3 }

* M: r+ x& z  x2 f" \% x9 U$ l[color=rgba(0, 0, 0, 0.74902)]前天,学设计的女朋友问我,能不能做一个旋转图片后,多图合在一起显示的小玩意,她打算自己做一个简单的ps工具。于是就有了这么个奇怪的玩意。。。。今天整理一下,发个blog. n! D% Q+ i7 |) c& b  h: i
想要的效果对比,原图VS显示 1.jpg 1.jpg
# C  h; U+ x( ]- C
0 V% e  M; f% {$ B9 P9 v
0 u' z! _( ^6 J- d, B5 D) ?# G问题) ?# i* k# x9 |) }
# a' T; F+ J+ i0 \8 I1 G. ?) I
(1)在刚写出来时,在rotate_image()函数中没有加,im = im.convert(‘RGB’)这句话,就会出现有的图正常,但是有的图报错,无法保存,并显示下面这句话  A' J/ E9 f2 ?; ~4 C

6 S% o0 L" ^. v3 b  S3 I/ a这个问题可以在这一篇blog找到解决方法。就是im.read(url)后,再将图片转换为RGB格式(image.convert(‘RGB’))。这样就可以避免很多因图片导致的问题/ q/ w" O4 r1 }3 o0 r& Q' m; K+ j
6 {' R* r4 b) c' E7 R
(2)在matlabplot中,显示图的第一步是创建画布,plt.figure(),然后在画布上添加子图,最后显示整个画布的图像时,并且让子图自适应来显示。而我遇到了这个就是关于self.figure.tight_layout()的警告,见下图。
' T; z) o7 A6 j/ k( F0 S: P- g- x5 A4 |, l% N: z
一般在使用plt创建一个画布后,程序本身会有一个自动调整子图尺寸来使用画布的情况,但是因为我是显示图片,所以这个自适应就出问题了。但是还好,只是警告,不是报错,为了方便,忽略就好…(但是我不推荐这种做法,希望有人研究一下,并把解决问题告诉我)
3 H( T' o, s7 Y9 Z6 j为了方便,我直接在一开始加上下面这句,忽略掉。: M% v% M: E. K) y3 V  R. {$ ]
import warnings
2 T4 E8 T3 E4 e" @, Qwarnings.filterwarnings("ignore")& y% K2 o7 P* j: Q. m8 I

7 _4 X' w: J/ @2 L' \3 m要点+ g, |; v+ \8 j+ E$ C
* D. ^& k! @& j# h; m5 R
1旋转图像现成的工具很多,一个是cv2提供的,主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转。但是它是以坐标轴为基础,绕中心旋转。那么就会出现一个问题,旋转后超出边界的图像缺失,而没有图像覆盖的背景会很突兀。此方法效果见下图:- w3 o  A  d$ V8 s- x
" P+ y4 A. Y( S. N0 z- q  @$ M5 i! u

1 c5 f6 O; I/ N% @8 B* L0 ]1 A 3.png " D' q! q$ P( \* H6 N$ K6 i, f* E: R

, _( c. a/ s; N4 S2 x这不符合我的要求,我希望的当然是连着画布一起旋转,就像ps一样,最后的成片不可能会有画布露出了。
' b! b; V' @3 p. C& r5 N5 R; S. w- L6 x' G4 S
这就有PIL提供的另一种Image.transpose()函数,参数提供90、180、270的旋转功能,并且这是连着画布一起旋转。再看名字transpose,转置,再结合np.transpose()的功能,就可以明白为什么只有这三个角度的操作了。这很符合我的需求。就用它了。此方法效果见下图* Y; _* a2 e( K* G) a
! |% d' M4 c+ H, _  v$ g
4 Q$ D# c0 j9 F# d
4.png ! i3 J& v% F/ [
! U- }5 _: {1 _( E2 k
代码#! /usr/bin/env python( K: I' v# u/ l0 P- J
# -*- coding: utf-8 -*-
+ f* }6 v/ ?9 g& |% }% d# ! python3; L( [2 \& J4 }5 H& g' P

  \3 J5 L3 g7 i* T# Himport cv24 H! {! ]$ ?% p& _' O
import numpy as np
0 Z- Z$ m6 s# W7 A2 ^# xfrom PIL import Image
) B0 m- ?  S0 n2 R, v4 H( t8 i# `from matplotlib import pyplot as plt
2 y4 z% s% ^7 o" Z: D( `import matplotlib.image as mpimg
+ v; m* Z5 _: e- Y# o$ B/ y; M# [5 s4 U0 W1 Y
def rotate_image(url):
& L& a1 i, C; I8 _6 x5 u* P' K' n, L        #旋转图像,并将其保存为4种角度的图片& [; a/ Q3 S/ V6 m6 E3 U# E
    im = Image.open(url,"r")
* k( H& f5 |8 |1 y/ {! O7 k    im = im.convert('RGB')  #避免有些图报错 : E, V; l  b/ J* \
    im.save('image_test/test_0.jpg')
5 s0 K! G/ H% I& F) [1 f+ h' r    im_90 = im.transpose(Image.ROTATE_90)
* f% N" a9 t: ~  s( T% k: v/ ?% R( h    im_90.save('image_test/test_90.jpg')" w. F9 L* B/ L$ k- M2 ?& y3 i$ C3 N
    im_180 = im.transpose(Image.ROTATE_180)
& I, p! {  R% i0 J* |    im_180.save('image_test/test_180.jpg')! Z# I( \' |" F
    im_270 = im.transpose(Image.ROTATE_270)# ?0 r! l$ T) d( X: l  M1 T
    im_270.save('image_test/test_270.jpg')
" f, k6 d! n' s& l
2 ]$ P: ]) s3 z8 H1 t; K# Jdef plt_merge_img():+ n: H" c+ R0 [
        #将保存的四种角度的图片,叠加在同一张画布上
+ |; a6 x' N: u        #使用plt.figure()创建画布,并用add_axes()来分割区域显示图片
2 \) q" {+ n! Z8 o% T        #显示画布,并将其保存为fig_size.png  F8 Z4 h% N# _# V$ {
    img1 = mpimg.imread('image_test/test_0.jpg')
0 J7 m7 T. r  q. g    img2 = mpimg.imread('image_test/test_90.jpg')' \( k) F+ x6 ^# Y; }# C
    img3 = mpimg.imread('image_test/test_180.jpg')
4 f6 \! _! \: c  j% R! |( E  a    img4 = mpimg.imread('image_test/test_270.jpg')
. k( [5 o0 e5 h0 h, b    fig = plt.figure(figsize=(60,59),dpi=96); ^, h' G# ?' }$ S: D4 U
* \) k, K% S# j1 I7 P0 @2 j1 r% u
#上方的横图
! A/ A, Z; j; [# ?- x* L  t, @    ax1 = fig.add_axes([0.30,0.55,0.42,0.28])
: B( X! C3 J; o. G    ax1.imshow(img1)
9 t3 f7 P$ p. s: |% G    ax1.axis('off')) |, q" Z1 ?+ p9 l7 E6 q

7 M6 Q% {9 z, |8 H5 l6 Q0 [2 R0 o  m# 右方的竖图7 y: P- E1 W$ v4 l3 y& c! }! u/ C: g
    ax4 = fig.add_axes([0.67, 0.29, 0.28, 0.42])& l- X; E$ h9 D. H% o8 h
    ax4.imshow(img4)5 W" W7 h7 x, g, }, H( d
    ax4.axis('off')
, b* i2 E# \( {6 \1 P3 j/ |3 f) ^* [, N
# 下方的横图
7 S% V9 [9 G; x9 c, Z) J    ax3 = fig.add_axes([0.30, 0.18, 0.42, 0.28])! T! l- R5 j2 q: [. j  z
    ax3.imshow(img3)/ J  y; e3 J! n7 O
    ax3.axis('off')
, t! A% y3 T8 n0 m/ v8 x- \
; }0 H0 z# z. ^9 N' W#左方的竖图
& B0 j/ x' H# m. v$ h) B    ax2 = fig.add_axes([0.07, 0.29, 0.28, 0.42])! C; g; I! n" s3 o$ w/ ^9 p! J
    ax2.imshow(img2)
- K& D- J  p, g" m. S* u$ f0 u0 j    ax2.axis('off')
% B1 r1 f$ h  ^* f* |* I( v) c    # 保存为sig_size.png8 Z  V/ j# c, v: ~  W0 o
    plt.savefig("fig_size.png",dpi=96)
" [$ q' i. d; I3 k0 p% c    plt.show()% Y5 r/ @) x4 R' B( A; p/ p) ~

/ ^7 H4 _1 R# s4 [4 }% [! k" N8 tdef main():+ _1 R# d: z8 t
    url = 'test_1.jpg'6 W% H; f% E8 U8 m- n
    rotate_image(url)1 l4 B* q$ a! S/ t
    plt_merge_img()
) u5 A4 c- H9 _; _/ C, ]. @: d/ Y' D% v2 }; V% {. s
if __name__ == '__main__':, @2 I  h! b7 \& h
    import warnings4 Q( e# j% D9 A8 g
    warnings.filterwarnings("ignore")
. N, ~( W( p' q" [  e! c    main()
0 X7 ~5 U, G8 L1 v: f- O' @5 a
. |& L. D+ S2 o$ m8 T" A, _! }: ~————————————————
% j" z4 P2 u' ?# {( D6 f+ ]版权声明:本文为CSDN博主「你要啥自行车」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。, l# ?( O1 x$ l* g; Z9 @! \+ n
原文链接:https://blog.csdn.net/weixin_42572826/article/details/106033709/ K' J6 ~) k/ H2 q7 Q+ B6 `
& D9 J- P3 i0 f
7 G$ E( z7 _) J4 X- Q9 {1 h
: |% ^. ~! I6 R4 A$ j1 \: [

作者: chace    时间: 2020-5-11 12:57
感谢分享
: ?- \$ H) q' d& h




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