QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2109|回复: 0
打印 上一主题 下一主题

python将红底证件照转成蓝底

[复制链接]
字体大小: 正常 放大
杨利霞        

5273

主题

82

听众

17万

积分

  • TA的每日心情
    开心
    2021-8-11 17:59
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

    自我介绍
    本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。

    群组2018美赛大象算法课程

    群组2018美赛护航培训课程

    群组2019年 数学中国站长建

    群组2019年数据分析师课程

    群组2018年大象老师国赛优

    跳转到指定楼层
    1#
    发表于 2022-9-7 11:41 |只看该作者 |正序浏览
    |招呼Ta 关注Ta
    python将红底证件照转成蓝底2 T+ z2 Z9 \# V/ ?" D  z! w
    前言' h% C9 P( p' X4 Q0 U
    emmm…快开学了,手头只有红底证件照,但是学院要求要蓝底,这可咋办呢。懒得下ps了。自己撸起来吧。
    6 ?, B# K5 s' u0 A+ G$ `
    3 l" m% s* H; M* `
    # C$ [& v5 G: @$ Y2 Z+ V
    , _4 _9 m1 L- T# b) L
    5 L1 I3 s! `" {方法一: lableme0 z9 i  _, G) l
    lableme标注完后。得到一个json文件,然后将这种json文件转成掩码图.
    ( c) U, w' Z: z& D" o
    ( Y: J. y& R( C& p0 V) g5 A# 代码来自 https://blog.csdn.net/hello_dear_you/article/details/1201301557 E; j; o' D: _& @! n4 b' ^
    import json: U% h  H2 s( K4 L* o, ~- F& c
    import numpy as np8 q: v( t3 S) C7 C# v- d0 E' b% z
    import cv2+ K0 T$ p$ J" S) v8 r" _) [. P
    # read json file  F1 @3 w! E9 f6 `, H. N! M
    with open("origin_json/mypic.json", "r") as f:9 h2 c3 W1 [2 ~+ H
        data = f.read()  g" O2 m+ z+ T6 X: m+ [- Q1 {

    . D! C' F+ O, A6 a5 u# convert str to json objs2 ~, H2 o/ @! [% T3 M& R
    data = json.loads(data)
    ' v! T4 g, q- a, m% D) a$ R# C4 w0 z$ P4 q
    # get the points ( M/ p1 Q' u3 t9 N2 W+ d2 N
    points = data["shapes"][0]["points"]
    : k  H8 Y8 x6 l9 L, G. gpoints = np.array(points, dtype=np.int32)   # tips: points location must be int32  P4 r" u: D6 Z9 V

    9 E* v' e0 R  B$ s. f# read image to get shape
    , r/ Z% z: B; _$ Ximage = cv2.imread("origin_png/person.jpg")+ Y) t# o8 D7 }5 W2 A7 `

    ( a& @. B& k: |6 k, o+ a( z# create a blank image" S, L8 E$ w  {( e8 N
    mask = np.zeros_like(image, dtype=np.uint8)2 x$ M4 ^. b% |' x

    ( ^- Q! `. R  ?( y& H9 x# fill the contour with 255
    ! j" h) ~; Q0 j) ~& Ecv2.fillPoly(mask, [points], (255, 255, 255))% v" O1 K3 E3 H% Y4 K
      h$ b6 w4 W2 Y
    # save the mask ' O+ P( L) S4 Q3 z. \: v
    cv2.imwrite("mask/person_mask.png", mask)
    % Q- g( ?# l7 z1% F: p- `- {. [1 m" t
    2
    / q- q" L4 A& L" t, h3
    . C' Q* F) m. s2 y40 d( Q# J1 N( i5 c* R3 `
    5+ U* E: _9 J/ H, h& ]
    6
      Z( V% l  ]( d5 z7/ N; n  d( E4 t( O% B' w# h
    8
    . U% ?5 G+ t+ a1 n- c9 W+ N4 `2 j* z9
    % W, |& C5 M2 h1 A1 V  g10
    6 Q4 a) v; U+ A9 I6 }113 j, g( C: d' B( Z8 v; A
    125 u9 e. R# c8 Z9 Y; }
    13" w, O& m' R, q1 \* ^/ Y* }$ M# J
    14+ t4 y1 n( T" {8 `3 ^; l
    151 S' N; `2 e( J3 O! {
    166 w9 x/ i/ J. A- A3 x) X, V/ q
    17, K1 y/ u+ @1 z4 s7 w1 u* O8 D$ H
    18* i2 L8 I. _$ L
    193 Q3 L: ?" T6 c6 g
    20
    - C' n2 x( b% _2 Q* {# `21
    3 a( A1 E  s% Y7 a; `+ c222 g; Q- L! N2 Y: ^" [5 g- b+ w" G6 w
    23
    % T: e6 ^. y3 q  e24
    - }( B2 d) z/ |' N# m4 j, O25, o( F8 N9 X1 o. X. H
    26( ]# ~1 U. a* i7 @
    大概是这样:
    & A6 @- I8 f( Z9 N
    & x( a! S9 w/ G2 v" l* q
    . {8 S! D+ k- o* F8 D! o! B然后利用这个mask生成图片
    ) U7 ?; @4 t5 d1 Z3 j# Z8 f# N( _* |6 }
    # 参考自: https://www.jianshu.com/p/1961aa0c02ee5 ?$ b5 U& B4 P3 T# Q6 z* F, P, U
    import cv2- z+ h+ c" i7 E' i
    import numpy as np' |5 e6 y) T: Q" K0 r$ n  f

    ( G; |- {0 `7 t3 l- S' Z# m& ^5 a, a
    origin_png = 'origin_png/person.jpg'
    3 P9 E( [3 G6 e8 q" c# maskPath = 'mask/person_mask.png'7 q$ c) X5 M/ U& ?  ^
    maskPath = 'mask/bmv2.png'2 X1 j# G; m+ S. `& N, t8 I
    result_png = 'result_png/result_png.png'
    ; j4 a9 s5 s* \+ S6 M# S/ l0 d' T
    , {5 Z3 O; @/ x4 r5 k
    maskImg = cv2.imread(maskPath)& H( D; c9 M9 x' F
    img = cv2.imread(origin_png)* ]' v3 c) f, ~" c" T
    assert maskImg.shape == img.shape, 'maskImg.shape != origin_png.shape'
    ; D. Q& ~# \" v9 ]( ~4 a& n& L7 u( q" h7 ~1 ~+ ~& i1 V
    h, w = img.shape[0], img.shape[1]1 |( P% o2 ^3 `2 {
    print('图片宽度: {}, 高度: {}'.format(h, w))
    4 u' d6 }" z4 `, ?3 R9 N+ l0 p0 O/ ~& A/ l: a0 u9 R1 G
    rgb = (19,122,171)
    0 j7 _9 y3 V7 [bgr = (rgb[2], rgb[1], rgb[0])
    7 c' _6 W) s( b7 r2 U# (B, G, R)
    " c5 P! Q) ?: ~9 T# Y7 tfor i in range(h):
    4 ?& O2 R$ E: T3 ^6 i6 ^' H    for j in range(w):0 K" _7 U0 \: w3 r5 q' }
            if (maskImg[i, j] == 0).all():
      x& d  N! m* ~; c; z            img[i, j] = bgr0 z; @5 a' O9 K2 n, V( V7 A
    cv2.imwrite(result_png, img)
    ' D% o6 t4 s+ C# P3 w* Vprint('图片写入 {} 成功'.format(result_png))
    2 \; U8 t  G" v& J8 Q# @1( X5 ?' E6 \2 ]5 r
    2
    - p) j+ q; n  [$ ?( T% w3, h( Q. H8 w2 n; K& M
    43 s7 \$ Z. h$ p
    5
    4 u) L( a! {! h/ b2 I6
    " Z3 n0 `7 I5 P5 z, {4 m7
    + |7 f; D) r8 F. V0 f82 q/ C. [  W/ D
    9
    / ^4 k, c& q/ W7 h( k103 A, g! A' x' s
    11( D6 o7 T/ k+ K" w# }/ r* [  P
    12  U/ W. a; ^% l5 N2 r! ]
    136 w9 b: v/ |' u, X( `, w7 q7 ]
    14
    0 G* T5 o3 A; I. |3 M5 c15
    : e& C) l1 c& y3 e; F163 r0 d/ ?1 W$ _5 n
    17
    ) K) \- w. |8 i+ z+ F" F& ?' r18
      w& }# @$ [; t' m' X196 I; T5 M! j7 }8 o
    20
    5 M  J! ?9 F( X: H21
    / Z, T9 ^# q. {2 s229 d$ ]. M( ]: N+ a+ J8 W
    23: T9 O9 |3 c( Q. N8 R4 R
    24/ c1 q2 X4 B, r! J
    25
    0 \- x2 }9 y- r2 e, U  K264 N! D. }4 m! G' M
    27
    - ]& s7 e& ?! p# v2 P# M由于人长得一般,就不放图了…+ X; E8 L: ^$ [- E+ Q  L; \

    / z6 e' A4 i+ }" a/ s缺点:& L& f! _# z" w/ T
    lableme标注时挺费力,并且难以避免人与背景边缘会有残留红色像素的情况。0 U( Q( ]4 I& e8 ?4 x+ ~

    7 ?  e/ C- A2 b; ^+ i* K2 j* o) j' G- e( _
    ' h4 v; s8 a$ j2 L, u& `* g2 x/ d
    . ]$ R& |# N) A1 [. s

    : y/ V  d- [8 T5 C方法二: 阈值
    ) ]  y7 u, e) t0 r! e/ C该方法通过比较像素的RGB与背景的RGB来区分是否为图像背景。
    $ h$ m( H/ T( l2 o
    0 H1 ^) P0 x4 y' gOpencv+ O% R  P- W2 I5 I! m9 T
    import cv2
    , P) S$ g$ s/ F( M, A: bimport numpy as np* p% g. _2 s9 F$ q9 Q

    & C; |! a& _$ z4 l- S% r: b; {9 f! S
    def mean_square_loss(a_np, b_np):
    $ E5 R4 S: O) l+ W, w) E    sl = np.square(a_np - b_np)
    + m5 K0 {! s6 ~/ d    return np.mean(sl)9 Q. F4 Y3 h) P) g) p0 d
    7 Q+ {, h$ A; j6 D" a
    ) X( J1 [9 H! S* `
    def change_red2blue(origin_png, result_png):
    ( {6 X. y3 a0 G7 a6 `6 q    img = cv2.imread(origin_png): r, a* y: _  r- U: P% A% J
    " h# _  v" f! J4 M* d: O
        h, w = img.shape[0], img.shape[1]
    : _2 U# J9 z: f    print('图片宽度: {}, 高度: {}'.format(h, w))& C- t# ^$ Y* [) k$ r8 X

    # D, G# o5 [( m& I    origin_rgb = (168,36,32)  # 可以用浏览器啥的控制台工具提取出背景的rgb值
    6 |( ?  N0 d' F# E9 }% ^    origin_bgr = (origin_rgb[2], origin_rgb[1], origin_rgb[0])
    6 J: q0 [& A' p9 `$ G    target_rgb = (19,122,171) # 蓝底RBG$ z, t* f$ l" w! x, B/ ]
        target_bgr = (target_rgb[2], target_rgb[1], target_rgb[0])! a( o2 S" \; c3 V( E4 |
    / }  m; o" T- u
        for i in range(h):
    ' o7 z3 v3 e$ v( E  j        for j in range(w):
    9 D  Z: z& n* E7 G7 Y9 Q            # (B, G, R)
      z  p4 q$ w3 m+ W) a            if mean_square_loss(img[i, j], origin_bgr) < 50:5 C" }- L: ~% @9 P; N
                    img[i, j] = target_bgr ) ^& O6 l6 y2 w& u5 J0 B2 _4 j# n( @

    % N6 G! ?6 A( Q- @3 d; M  R    cv2.imwrite(result_png, img)
    0 w( P- g  l- z# E    print('图片写入 {} 成功'.format(result_png))4 R) H5 [1 U$ S& t( X" Z( ]. ?
    2 D: @6 @1 P( \6 s, x( v
    " k: v" O1 i9 q* c% r4 c
    if __name__ == '__main__':6 u3 r8 f7 H- g  @2 r
        # origin_png = 'result_png/result_png.png'5 M$ D, t: h" I- X7 o$ j
        origin_png = 'origin_png/person.jpg'
    ; R* s) g' ?- d4 _) I: J    result_png = 'result_png/result_refine.png'& q  ^5 t) F4 K/ C" q! y% u
        change_red2blue(origin_png, result_png)
    4 E/ x4 ~1 z4 M1% ~1 n. Q* f4 k: S- n
    2% }3 [  k! g: R( w# U: R
    30 r9 n+ ~' ]# V* I3 u$ d! W3 w/ T
    4
    9 q" ^9 p! l  @' J8 V1 s! P5; r: O# L2 H4 O3 ]- f3 p
    6  p8 K% b& z- x* W# Y3 Z
    7
    - Y5 F& c  L5 D# C% |4 ?) {) ^8 L4 d3 f8' [9 o5 ]" B9 U4 O  p1 ^7 [
    9
    : J+ D3 i/ K1 q# L* q10- a$ L$ s: i, ?) h- Z4 O
    119 W5 j4 E  ?4 l8 I
    12
    * R& j7 Q* u; j9 E8 T) W9 ]13% e. e2 L# V, A$ h! ]
    14; V" y. B0 h! Y# Y9 @2 }
    15" H0 y3 `/ V: V: `# i5 @4 {
    16" F1 c" G( u& E" _' u. n) N% N
    17& r; T" B3 i) E
    18
    & C2 m& W' A4 Y+ I7 @8 }/ s: u1 _19
    # m- o/ j8 v) g- ]20
    + B8 w- l, d" u+ {0 h' z21
    ( ?2 ^) O) O) x, m; p7 W% A22
    6 O* k% w, y8 w5 {& }* \23
    + N, T/ o5 a5 n$ t+ d7 k: h24% G% B+ E1 R7 U. v
    25
    8 d* l8 N2 Y. c) o26
    & C1 F. _' ~5 r/ a$ C* f6 a27
    5 H$ D' ^& O. q! H6 ]: Q28
    8 g" ~) D) ^6 b1 j29* g* i0 u0 ~& J
    30; O+ L9 h) A3 z; S- ~" ?( U/ f" n  T
    31
    1 a- x2 o' Z4 e# ?- H$ a32" d! |' A: S$ R; u4 o! B! B
    33
    : n) |$ Z+ _; [5 E9 f, D34& n4 P1 g& M  s, N' w! p  h  W
    35
    ' b# d/ s( t! F3 ~0 C9 B$ l, P结果人与背景边缘仍会存在红色像素残留; l3 I4 L. [2 s) J
    0 y& j$ [+ b7 V9 e! @& t

    $ I4 o' [3 r) O: Q  s
    ) U' t4 U/ O; }3 ~' t+ T
    , f7 G8 Y5 J9 d; k2 F- Z( c1 [
    8 J* I# m9 f1 Y3 W' z5 lPIL
    % C+ E4 |5 }1 G' j+ ^- B3 }) dfrom torchvision.transforms.functional import to_tensor, to_pil_image
    " M* C5 d0 c0 ifrom PIL import Image
    + [+ z0 r; c' }* b3 iimport torch3 @# J+ E& T( o+ j/ E* r2 Q: `
    import time( b/ R! t- V+ B% f# _
    2 Q: y0 n! l5 Q, h7 X( C8 T: e

    9 N0 X, h6 M" H2 F9 Xdef mean_square_loss(a_ts, b_ts):
    * Z  Z8 H! b  y3 |    # print(a_ts.shape)/ u, _1 i1 O# S- p  ^
        # print(b_ts)" J, l) T: |+ Z+ J, O
        sl = (a_ts - b_ts) ** 2
    ' W5 l; D! I/ v- s  ^7 d5 X; D    return sl.sum()4 C: Z6 N, A! M! x9 Q

    ; d# Z# n5 R$ [  z+ b4 [
    8 l3 b# Y7 |9 u3 ]; ^4 i3 Edef change_red2blue(origin_png, result_png):
    : k( {% l  m: _: @; |) ?$ @$ ?# @3 F7 u    src = Image.open(origin_png)# E# v7 v6 u+ I6 v; q5 _
        src = to_tensor(src)6 z1 u% u  h$ R2 i# T+ e& x
        # print(src.shape)  # torch.Size([3, 800, 600])
    3 L4 e  S  G0 q8 z8 ?1 e    # channel: (R, G, B) / 255
    , V5 A. [& y2 O( q+ V  k. K    h, w = src.shape[1], src.shape[2]
    8 @- B; Q$ H( W0 `+ }# ?0 M7 g, A' u$ a; B9 B
        pha = torch.ones(h, w, 3)
    - W3 k6 [6 \1 A& l- a# p# a: ^( ]. B
        bg = torch.tensor([168,36,32]) / 255
    9 j* x8 E+ _( Q0 m6 i    target_bg = torch.tensor([19,122,171]) / 255, y7 G# b3 L# B  v$ p. K  J+ U3 A* I

    * S1 j; n  g) e: {' F! u  b    # C, H, W -> H, W, C
    " n8 J: O! n; w. j    src = src.permute(1, 2, 0)
    1 j2 r! X6 x) a: O    for i in range(h):" |$ j) ~  L# ]% }
            for j in range(w):
    5 e, D3 X9 \8 X/ t) }- S            if mean_square_loss(src[j], bg) < 0.025: # 0.025是阈值,超参数* [* m/ {7 Q$ j
                    pha[j] = torch.tensor([0.0, 0.0, 0.0])/ `$ }+ @2 G, ]: }
    7 @9 V( y7 I( _" Y( n
        # H, W, C -> C, H, W# d4 i4 @8 x9 s5 a
        src = src.permute(2, 0, 1)# j& [7 M. N- ]  n9 U# ^0 C
        pha = pha.permute(2, 0, 1)4 N# n8 {# c& h$ k3 _! t# {$ V
        com = pha * src + (1 - pha) * target_bg.view(3, 1, 1)* }3 a& `1 F9 A) N! o' i. B; v7 U* T
        to_pil_image(com).save(result_png)( s3 t4 e# d. L* c3 |

    / }) `# d0 S6 v3 D: f  Q$ |
    - I5 K8 @2 x5 Bif __name__ == '__main__':
    0 d: P6 `6 v* m2 ^( n# J    origin_png = 'origin_png/person.jpg'
    : Z$ z; m3 J( f/ Q0 k    result_png = 'result_png/com.png'0 w. V% q, C- h1 @6 l
        start_time = time.time()2 `9 [4 }; P# J9 m
        change_red2blue(origin_png, result_png)+ d) j/ G5 G9 R2 p. L8 v; J
        spend_time = round(time.time() - start_time, 2)! T; H; i5 \( z+ |/ X. f
        print('生成成功,共花了 {} 秒'.format(spend_time))
    % I. G4 q/ j5 {6 _! R4 h1' e  v5 {/ c* V/ ?9 ~& E9 f
    2
    , ]( z8 H; e' S7 X3 Z3
    0 n: e2 E& B$ O9 h4* C: i. e2 n  }$ u- P7 F. K
    5% C$ v9 N# F6 Y  h2 c
    6
    1 n* E4 Y1 s/ T2 o7; u, W! I) }- P0 c: W: S% K
    8& w  i' h( m1 N- `7 _; e
    98 x; G/ S( u! D! s
    10
    ! _" t4 t$ p8 ]11
    7 X+ p: ]: b( Q% a3 k12# j( B& w" ?2 L& Y  ?
    13! l  i1 \. d$ x* t8 f" M
    14) r* g5 K; j: ^% ?
    15
    ! X% K3 v! J- V: X- W3 G16
    9 j  S0 c2 H  T! T171 S8 U* U+ D, u
    183 o4 x* ^5 |8 e7 U8 E3 P
    19
    # k& e4 l% i* Q# d& L0 n20
    2 F; N5 I" Z3 P. E; W; v212 |; n7 _3 N* o, w
    220 E4 E7 M7 l+ }1 y* A: T  z
    23
    ! d: }  e& X# O' a3 ~+ x24( u$ a, N6 M) t. i* l0 D$ Z+ g
    25
    ! M! c. r! H2 {263 T, q/ @3 K# ?9 P! @
    27
    5 R. n* _- t  N+ ?# P2 e9 ?5 W286 l) @" Q6 _! e6 c3 ]/ I. j5 O
    29
    8 q0 y6 u1 H" y7 S30
    ( S% m5 w' Q% N' K& \# O9 l318 ^3 Y0 H! |9 v
    32
    ! s1 B; j- X5 B9 _33
    " }  Z3 ]% z  K2 J  \34
    * E% x, o9 E) `4 g) r# t. a6 j35
    % [& C9 `+ ^2 G0 m& \% y( d& K36/ [6 h) R) a3 L8 \" g
    37- j  F6 r$ n- ^7 y, o# _$ Z
    38; |2 m& ~% x8 l* J( W5 C- r2 W- x
    396 h! A& R5 c, _. W/ K" l5 f
    40
    2 t  C( T5 e" L- y* J+ ~41
    , H8 y) w, J2 L0 z' d42+ w) e3 a# k6 f+ n
    43
    4 w; N+ o2 e7 B44
    8 x4 H( j; v: n2 T7 p( W4 N45/ d! p. x$ `. Q9 B# f* V9 p  R
    46( F4 w- ~9 c! q
    该方法质量较好,但一张图片大概需要12秒。$ w0 [$ R# a4 P2 ]6 O' ^
    & p2 M. g, e& T7 H: Q

    # y& Q) C# T- ]% t; @
    6 R3 h7 H1 q5 z. R# }9 m方法四: Background MattingV2
    2 [5 j: M% ]8 s3 O1 k7 X" ?+ u- TReal-Time High-Resolution Background Matting
    1 \1 s, L" W) [; {; u- k, |CVPR 2021 oral& g' {& C( Z8 G, M5 W* c
    " \$ v. d( }; o6 P
    论文:https://arxiv.org/abs/2012.07810. _8 g% J0 C4 p  Y
    代码:https://github.com/PeterL1n/BackgroundMattingV25 q" t  H& [/ Z' ~

    9 ]* p& z! S1 a0 n1 Tgithub的readme.md有inference的colab链接,可以用那个跑
    % m5 f% @! r, D6 T
    0 N8 j8 E7 @9 _  Z- [. C3 L( O由于这篇论文是需要输入一张图片(例如有人存在的草地上)和背景图片的(如果草地啥的), 然后模型会把人抠出来。+ c0 n  D$ P3 G8 V0 H) ~9 B
    * G- `9 F3 N- z/ U
    于是这里我需要生成一个背景图片。
    8 w- x/ G: J1 Y& }7 P' I首先我先借助firefox的颜色拾取器(或者微信截图,或者一些在线工具,例如菜鸟工具),得到十六进制,再用在线转换工具转成rgb。
    8 a8 d& e- X+ F
    3 K. `- ~) o0 q' g9 J4 F' d% k7 m然后生成一个背景图片。
    , Y6 v& D% x- [, l  j$ [; L" W8 r4 W. `
    import cv2
    ; o: k3 h/ h! u& ^, b3 _! Eimport numpy as np
    . b) N# b5 f/ S, k7 A. n2 q* I: P8 T1 `
    ; ?3 l. `# o$ g4 ]* L) k" @
    image = cv2.imread("origin_png/person.jpg")) Z+ U, w1 m7 |, T2 ^
    origin_rgb = (168,36,32)  # 可以用浏览器啥的控制台工具提取出背景的rgb值
    : e7 @$ s! m: s& M1 Uorigin_bgr = (origin_rgb[2], origin_rgb[1], origin_rgb[0])  y6 K3 C, |8 c3 a6 w/ `; g' C
    image[:, :] = origin_bgr9 w$ [1 i. |9 x- w! G

    $ Q4 N% T( C4 y; t" C- P" Q0 r1 Qcv2.imwrite("mask/bg.png", image)
    8 @4 {; x# K# P17 L1 t) r4 r: W0 r6 X1 l5 h
    2& }& Z' B9 v2 z# H9 U. I$ V6 O0 _
    3
    - o+ b9 ^; o# z) Y4
    / A& V/ e, V. n' }0 g8 U1 U5  [9 F3 v8 l& l9 i4 n& t
    66 N* c0 @% H! W: B) o3 c' W
    7* b1 ~* M* d8 w. V
    8! w) @# i+ l) U& r  H. H' y7 l
    9' @6 S1 ~0 {% y" k
    108 `2 o3 D5 N) C* Y1 i, }3 l
    ' k3 x' j; w% h+ @  g: c* S/ o- B0 v
    需要上传人的照片和背景照片, 如果名字和路径不一样则需要修改一下代码
    % Q% g# `0 U$ @9 q! `
    8 [* i5 ~& X- A# m8 s' d/ ]src = Image.open('src.png')( Y1 r% `8 ~  ~6 q" g- k4 Z
    bgr = Image.open('bgr.png')
    . K$ ^6 n( G$ i1
    ) a) f: D: X  y' b# z) W( a# l2! N( E) V2 M* ^4 @
    另外原论文是边绿底,要变蓝底,白底,红底则可以修改RGB值,举个例子,原来是这样的(绿底, RGB120, 255, 155)5 \/ N/ t7 E0 T
    - R6 [4 E: a# Q# m4 K$ `
    com = pha * fgr + (1 - pha) * torch.tensor([120/255, 255/255, 155/255], device='cuda').view(1, 3, 1, 1)  _; @) K8 E3 I8 V. N& [2 Z0 G6 z
    1
    + e% j+ M9 w0 }$ _$ c2 e
    ' F* i3 z- |# i' |2 Z+ `! e* Z那么加入我要换白底(255, 255, 255),就是
    $ i$ B/ Y" X1 k8 e1 n0 _' N5 {" c# p9 e' V: r; n
    com = pha * fgr + (1 - pha) * torch.tensor([255/255, 255/255, 255/255], device='cuda').view(1, 3, 1, 1)6 z; m) ]' x0 h. F6 A
    1+ |+ X" f( B2 p; T$ S- q. m
    ! J0 u6 V! s1 [0 ~8 W1 l
    假如像我换蓝底(19,122,171)具体深浅可以调节一下RGB,就是
    # d( m. c$ R. `1 G' e! Y
    ) ^* {, Q8 W; ~4 f9 }& F8 G4 i6 Ucom = pha * fgr + (1 - pha) * torch.tensor([19/255, 122/255, 171/255], device='cuda').view(1, 3, 1, 1)
    & r5 f/ b5 b& B  M1 W16 O# \: ~& [3 y, Q$ K% J  \/ P# m
    总结: 其实这种方法从 任何颜色的照片 都可以 换成任何颜色的底。只要换下RGB.
    5 M0 G% _8 o9 S+ q; c0 j2 T( C$ m) r/ B/ Q6 r
    然后就输出图片了。可以看到效果相当好。不愧是oral。
    - v2 b( T8 D  y- p) \! C8 `( I
    1 r" v7 U7 T' a
    . W; S8 @: [" j* w; n5 `! v  [+ r原论文可以实现发丝级效果9 i1 k* J" d& \2 D; \& y  d
    9 Y1 `( k6 e8 O# C
    7 K. h. y9 w/ w" F% G1 O
    7 r3 Z* P7 p( d$ U8 `
    1 C5 v( b- `# N: ~6 b0 S: Z. s

    ! s7 U! |0 S. x/ \; m报错解决方案
    / i$ ~& J1 e: z% xcan’t divided by 4 / can’t divided by 16
    ( u! s1 L1 y6 c' E6 c由于该骨干模型可能进行4倍或16倍下采样,因此如果您的证件照不是该倍数的话,有两种选择方案。一种是padding, 填充后再送入模型,然后出结果后再用clip函数裁剪。另一种方式是resize, 给resize到规定倍数的宽和高。) F/ ^. R$ z+ r6 l
    这两种方案需要的代码都可以从这篇博文找到: python图像填充与裁剪/resize
    4 i) {, _+ T2 Y9 x0 ^+ |- h————————————————
    " n; I3 s! u3 v& ~版权声明:本文为CSDN博主「Andy Dennis」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    ( n9 F' f( }6 S! }, c1 k原文链接:https://blog.csdn.net/weixin_43850253/article/details/126376767
    * E( ?: |! n9 J) K; J& i" h0 O- U2 }* Z* D

      @; _& n4 p& q0 T& v
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-5-30 20:06 , Processed in 0.457420 second(s), 51 queries .

    回顶部