- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 565670 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174924
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
python将红底证件照转成蓝底; t, O8 M0 ~5 P9 Q. T0 f
前言
1 W; f8 U9 S$ X' j1 r! U$ wemmm…快开学了,手头只有红底证件照,但是学院要求要蓝底,这可咋办呢。懒得下ps了。自己撸起来吧。
1 r5 w- ]- n3 q* u* s* a, Z5 {- |5 h& B4 W* y8 G( m
[( ~% O6 B9 h
; v6 W. O$ C5 I* j0 K
0 o0 @0 i0 M( N' i" O方法一: lableme
" s0 X U3 I, X, x- R) q' tlableme标注完后。得到一个json文件,然后将这种json文件转成掩码图.
5 @% d0 S0 w9 o# c& ^* x' v
& @ @1 p5 h, |) |; u8 I+ t, \# 代码来自 https://blog.csdn.net/hello_dear_you/article/details/120130155
* `/ s# y6 i- ?7 fimport json
, B: T; r) O. Z Y5 m' Aimport numpy as np4 {; N6 g2 h- a+ \1 f
import cv29 H7 \( q. P0 j. z& _5 ?
# read json file, f5 \0 Q1 {/ U
with open("origin_json/mypic.json", "r") as f:
9 H9 R- v8 w* e6 w* E6 W: ` data = f.read()# ?5 N4 s1 V G* O+ i4 w- [
0 j8 k, d$ I3 f9 C5 h3 v' u1 R1 G
# convert str to json objs; y! r7 ~; n. o4 u: \7 A% K
data = json.loads(data). u4 J' Z0 R( u9 I
% C/ `6 D& [8 Y0 B2 J9 ^# get the points 1 O% N/ E* s# R1 ^
points = data["shapes"][0]["points"]
4 o% f- m) P+ B' }2 {0 \8 c! o1 o8 apoints = np.array(points, dtype=np.int32) # tips: points location must be int32; p% [1 r7 t# r+ T# q2 v, ~+ z: w: ?
! i' T$ L0 Y$ f. M% ?# {
# read image to get shape
, U0 j1 t5 s: C( ]3 c9 jimage = cv2.imread("origin_png/person.jpg")
: I+ u; N* N$ z6 W: v- w% w
! H+ D9 l) H" N; t# create a blank image
: @% |" u" X% j2 y" a2 Rmask = np.zeros_like(image, dtype=np.uint8)' O3 @3 R# h1 d- U& Y
' |; A7 f# |# z5 L+ z, ]& U: t) K# fill the contour with 255
0 A0 |4 n/ s/ ~- }1 ycv2.fillPoly(mask, [points], (255, 255, 255))
8 v% \) U, x2 S5 _/ t- I1 z# H& J u) g1 g9 Q) p' c/ D# V
# save the mask , n8 [9 V4 C c
cv2.imwrite("mask/person_mask.png", mask); B4 O2 ~# r) H. s/ t
1; V2 \3 ?& `% C" j) x% e$ ^$ W( q) v
21 D+ p3 K: P. N( E* z
3- x! k5 O" X( w7 _- H
4& H' E9 d% O" o' c( ]2 W E
5
" B2 t, j9 H- A {6* U( V# E; z: T( s2 f8 G
7
# D. A: z* [) U+ m. H3 L" x8
9 Z& `! p# s7 B( U" N$ C8 o9: s8 T* p4 A X, u& I
10
4 y1 I4 ?7 O$ X( R S11
% R @& D& ]# k$ Y' W12
. T" B+ o1 m: _" e5 g8 h& U13
* M5 K1 P* r" s, f. w+ J144 H& i7 [/ P0 D$ U. Z; u% x
15# o' ?) \0 g) ?# ?% @
16. L W# y7 ^; u7 Q% P
175 U0 w7 b$ x& \- q5 }- p
18
) r8 Y0 g4 j1 U1 x( I! ]1 c5 Y19- e, w/ ~1 ?, n$ l
20
3 B* `! G N! w/ H21' R T6 R! e0 ^# [3 u+ B O
224 D) W1 U+ _) ~
23
0 }. ` B, r: F$ b6 S1 P K# m24% Y4 P1 n0 K. u
258 E! i7 N4 N* l& `% N+ G
26
1 X0 A, x( `2 e" h5 O大概是这样:
$ X5 S. j, u; i0 O
) l6 L6 e8 p; ?9 i9 q( J9 x% T- Q" u7 l5 ?) {9 A2 T8 g
然后利用这个mask生成图片
0 ?9 l! l1 p' W F+ e. r) P6 p, ~+ S8 o9 s/ x4 D0 N6 M
# 参考自: https://www.jianshu.com/p/1961aa0c02ee
, v( v" W3 z) P, } [2 [/ w2 `6 i. Timport cv2# y2 o. U1 h) b7 f( A( ^# \
import numpy as np
4 B3 z8 v7 Q7 v* o5 v7 O: o0 Y4 ^ ]" i8 P$ C/ Y$ @& e
7 ~: E' q9 e3 r, ^5 \1 c5 \& z
origin_png = 'origin_png/person.jpg'
; k4 t8 }: M. ?1 F& k: ^# maskPath = 'mask/person_mask.png'
8 Y- _2 @9 g8 S7 f4 @maskPath = 'mask/bmv2.png'
* [8 K: C" M6 ~: O0 [4 xresult_png = 'result_png/result_png.png'5 u6 n* G, r- m1 V( ]
: Q5 ]8 C5 e, R- J# n( y
6 e$ A4 ^4 x' C+ F9 `' N U. ~maskImg = cv2.imread(maskPath)
F9 m) m4 M( ]3 ^6 ximg = cv2.imread(origin_png)8 S. v4 Q8 ^# T/ J9 x R9 i7 F
assert maskImg.shape == img.shape, 'maskImg.shape != origin_png.shape'% g4 C% i# X+ l+ L! B* `1 M; ~
# j6 F2 m; r- K1 x6 a
h, w = img.shape[0], img.shape[1]
4 Y7 d' `/ w: M- k4 vprint('图片宽度: {}, 高度: {}'.format(h, w))( [! D# T" u8 L5 G( E
/ q- c/ z. c- ^( V) K0 \rgb = (19,122,171)/ f7 U' N& A7 K7 @
bgr = (rgb[2], rgb[1], rgb[0])8 E# g! Q8 S! ~" G S* @5 u6 a B
# (B, G, R)) \! Y! z& [/ |; z+ F
for i in range(h):
* Q% f% m& N# g& x6 o- }) v' \ for j in range(w):0 U9 d+ _: w' X
if (maskImg[i, j] == 0).all():0 g% i6 J/ p' g' \" L
img[i, j] = bgr
* f0 W8 b" e( ~; ]0 c% kcv2.imwrite(result_png, img)
3 D7 b* c5 n) t5 N' R# Fprint('图片写入 {} 成功'.format(result_png))
: T8 G5 C( H* g2 ^$ @# Q1 f1& T/ c% I, E0 G: r! }) B% l- \ Q
2
- }( e& ~# q, n/ G+ E+ n% R3( p' ~5 P( u/ D) W5 m# j
4& b" I: d( x; `3 B$ n- ~
5: ^! Y4 q+ I/ Y; c0 T% k
6
! R3 M& y1 m" l" [8 g8 x3 p E7% W% P/ D/ a; j& y- L( C/ r
83 _3 c( M2 u2 ^: J, j
9+ I& O6 _8 @" t8 j. ?9 y
10: C( ~, |& M2 N2 \0 l! c
119 b2 q( J8 k1 ^+ s/ y$ m
12
- Z* b# t. m+ `, r, u13( d0 e" C- r' H9 r
14
. W, c+ ~' f' `6 N5 k15, I5 w( ^8 j$ [& P0 `& L
16 Z5 E6 ~8 s, N3 X5 R2 B% c2 w' W
17% p. R. Q7 B& {) A) @
181 A2 W# E+ p. B: V: D* p9 ]2 ~$ K' |
196 R" C4 ]" c+ _1 ^4 V
20' S4 U3 ~" i) @4 C2 G
21
. h5 |- r' H9 e. A) ~# e22$ P+ M7 l. m7 P* n9 L
23
4 ]' k( F' |/ w. L24- u5 l& B: V9 k1 z
25
4 v4 Q" x% c5 l$ h6 S- _# _26
1 @0 G+ M6 Z8 v; P! @7 l27
# c1 Z8 j! m( m7 `, M& H2 y( W1 L; b由于人长得一般,就不放图了…
- M7 z* U$ D* W$ J1 f0 r" ^6 f- x& I S/ x$ e. M4 _6 e( g2 |- f. J
缺点:
/ ~5 s/ }3 K4 E- C: @- Ylableme标注时挺费力,并且难以避免人与背景边缘会有残留红色像素的情况。( Z+ G$ V6 {# ^/ G. K3 Y
2 u6 M; Z8 O% y/ \* x% k* ?
& C" [) {/ l t6 Z2 w' E/ l% J- M$ r: y! p6 E
_- X5 y5 p, A- u5 ?# N" s* v/ v
9 }! t0 g* @; u$ ~; V
方法二: 阈值
) g# A' F3 N3 }( A. a3 I5 v5 ?8 l }# `该方法通过比较像素的RGB与背景的RGB来区分是否为图像背景。
$ U- V9 a! ?6 R/ w4 v) q, m3 s2 a
. \0 H) Q7 s+ @8 M; v, r1 f, _. A( ~Opencv
3 f. P7 }8 y$ A) v6 y2 W; Bimport cv2
8 V/ K6 Y7 ?9 Iimport numpy as np
0 T/ T n' Q8 J0 N- V& p) q5 X. M* ~4 A
- A, H! W: {# \8 B1 `' J) s5 O& ydef mean_square_loss(a_np, b_np):
# \7 a o( p0 C sl = np.square(a_np - b_np)& i* c6 V+ `& ^! |( ?/ O
return np.mean(sl)
3 K4 \) j* c# M" {1 u( ?( w0 R& D" ]
9 P7 h' m( n) kdef change_red2blue(origin_png, result_png):
, r7 H* c2 u. l- C! ~ img = cv2.imread(origin_png)$ c+ a) ^6 J$ I5 }6 m6 s
3 ]7 p2 n+ v, t* P8 G6 r0 r( L
h, w = img.shape[0], img.shape[1]
& }7 m: _& z& d print('图片宽度: {}, 高度: {}'.format(h, w))% Z# A0 D, `; [5 G& j3 f8 h
/ A. `% w4 l/ R origin_rgb = (168,36,32) # 可以用浏览器啥的控制台工具提取出背景的rgb值5 k, h3 s. `! |7 j$ Z2 `2 k! Y
origin_bgr = (origin_rgb[2], origin_rgb[1], origin_rgb[0])% S; r* G g. N: e
target_rgb = (19,122,171) # 蓝底RBG1 ], n" \2 u! `# R6 W, @
target_bgr = (target_rgb[2], target_rgb[1], target_rgb[0])
* C$ ] E( Q7 `6 d! l% m1 A W% {7 ~% W6 q; d) m
for i in range(h):
3 R( l1 n* `$ B/ f2 W for j in range(w):" Z! c( i( o( N# j2 M
# (B, G, R)
- r# b! V7 G9 M1 f( @ if mean_square_loss(img[i, j], origin_bgr) < 50:4 k9 K j+ r5 ^4 v# \% r, {
img[i, j] = target_bgr
# f4 I3 X G; y( k
+ [' _* j9 d; e7 N1 f cv2.imwrite(result_png, img). g1 ~; \* q9 x: ~ b7 A. @
print('图片写入 {} 成功'.format(result_png))" q4 h& g9 Z/ u" g2 A# _$ a
' V" Q$ E% T$ u/ T- p- M
- v4 R- g2 K0 V( A0 U/ Iif __name__ == '__main__':
/ u5 O& a: W4 W0 K- I # origin_png = 'result_png/result_png.png'; ~0 [) @9 V0 s9 q4 h/ q0 |
origin_png = 'origin_png/person.jpg'
3 D3 g6 \, @5 H% M& {% C \6 a result_png = 'result_png/result_refine.png'; R1 k1 p2 ~5 H [
change_red2blue(origin_png, result_png) {- A* G3 K6 ^. w
1$ F# D4 H% O' }- z5 }+ m2 P& p- L
2- y* g" x$ Y! s; t" b, u) s
3/ e6 Q% p+ t& \
45 U$ I2 K5 n- `! Y
52 w. m+ p% \( K' H4 G
6
2 H* u7 }2 C$ ?( |79 r+ D8 c! K/ w6 O$ O
8) S% I; o9 \; _" F/ f% I
9
]) v# ~$ ~" \$ n; m+ s4 ~0 y! @. z10
/ W$ j. q7 L' @' E* T11
8 K: W, @, ] g# I( Q, d) j# S121 o4 f+ [" x1 b2 U$ ?6 w" g
13- O) ?5 j, m- U: w. Z' i$ Y+ m
14
+ C7 u, ]+ P: r8 r! d15
- |6 a0 s8 @, n8 {( A; Z6 x7 b16
& \# B3 F8 G9 W. E17
- ~: B+ ^5 N1 N" f Z, P' p* N18' |% Y1 g& g5 P" q5 j9 J
19
: W, x& ]' }: b# v- a5 ]8 Q20% ~( }" U- Q$ R
21" e Q P" O) N* q' R( g
221 s' K$ d( n0 T7 U
23 t- ~, V" I. o( i3 y" _
24" s1 s; }- K0 J
257 H k7 i* A0 P8 i6 V, ~& r3 M8 B
269 d; w0 i7 d" Z- z0 ?( O( U
27
. I: I' Z, ^+ c) \* B' e+ |# W284 x& L. i1 z1 ~$ o6 g
29# V n: q, \' L) }
30/ f7 A+ O/ d5 G7 Q' k
31
' I7 L, g7 g; t: V6 U x- E32
7 g6 B5 t0 ~/ ?) {7 T+ {: Q1 l33( j$ v8 M6 b* @7 k; q7 ~3 }- j: o
34
0 Q, k3 H0 d+ z! Y35% ? ^1 s0 y! P0 Z* d2 F1 T* r: h3 `
结果人与背景边缘仍会存在红色像素残留( x/ N' t! G% ?! O& [4 c. w4 t7 ]
5 S/ d6 ]' Z$ l0 N2 k v+ ^! s4 `5 B, g* {4 @: c6 g5 D
( n# e. _8 t; u( a* Y
% Y) S4 v3 m! I
% s0 g D1 A# S1 _$ i4 R0 k+ {PIL
g8 V" ~* v( C ?* hfrom torchvision.transforms.functional import to_tensor, to_pil_image) q0 h6 P6 _: |2 R4 v& r# q4 w
from PIL import Image
% a# V* x6 h- @; }import torch
( v4 v. R: Z2 M+ X$ q% C9 Timport time
( a! ^, p& w$ h2 `+ l7 a
^+ ]! S, N( X1 B1 _$ d- `( Q/ X! |+ }+ c5 d* x1 g% D
def mean_square_loss(a_ts, b_ts):3 l1 Z* p, O n& P9 i
# print(a_ts.shape); c+ @$ e+ N3 ]- b2 N
# print(b_ts)
% i: r/ D+ _2 B4 n% z8 N& n sl = (a_ts - b_ts) ** 2
4 {: [ @5 l8 e return sl.sum()1 w7 ?2 @& [; Y$ X2 |* P9 j
% R+ `+ g. ~9 \2 ? ?- p- R8 w5 \ ]; g! Z" q2 R
def change_red2blue(origin_png, result_png):
9 t: L: ?/ T' G- T5 w, `: m src = Image.open(origin_png)" G6 A! j R- x; ]3 L# N7 Y
src = to_tensor(src)
' s+ J* z/ F3 m l3 z; v2 w& Q0 l # print(src.shape) # torch.Size([3, 800, 600])/ l8 d* Q! w [3 Q/ A# X# o$ t
# channel: (R, G, B) / 255* U" n0 q: t3 n2 }& J0 O# `7 {* x
h, w = src.shape[1], src.shape[2]
: S5 h% Q' L" x# T
5 _) T9 m, L0 Q pha = torch.ones(h, w, 3)7 J* R9 q5 @, T( m9 p% p7 m
1 q3 X; |% Y( M8 B* |
bg = torch.tensor([168,36,32]) / 255
* ?1 C; ]' _3 x6 k/ M$ B4 H( d target_bg = torch.tensor([19,122,171]) / 255
5 d8 G& V4 ]# k3 i1 y1 f1 p) O+ K+ t+ Q2 g% F+ Z, b8 Q
# C, H, W -> H, W, C. N! k9 S: X: U( s5 W: G" v
src = src.permute(1, 2, 0)( s! o7 m; u1 w2 P# A
for i in range(h):
8 E& E1 S1 T* J0 z' Y for j in range(w):
: X; o! q) {; X# {. \ if mean_square_loss(src[j], bg) < 0.025: # 0.025是阈值,超参数
' ]1 g/ W) X+ i, H& K+ ^: e( z5 _6 _- _ pha[j] = torch.tensor([0.0, 0.0, 0.0])) O5 E' s* y) D
# o" e$ d5 C) t/ z" @* Z # H, W, C -> C, H, W" e* v% }8 P K& L3 W; V
src = src.permute(2, 0, 1); `* \% q' n; d H! V7 Z3 _: W
pha = pha.permute(2, 0, 1)$ b! u- G! Q% J% J
com = pha * src + (1 - pha) * target_bg.view(3, 1, 1)
( W6 F/ t2 d& u* v c# g5 P to_pil_image(com).save(result_png)
, s5 ~ `9 T- w
' X( n9 q8 t0 N; n4 l
9 x8 _; N- h' v* ?' _- y9 Vif __name__ == '__main__':6 i' j. F1 x* K
origin_png = 'origin_png/person.jpg'8 L4 D6 O+ D7 F3 Q5 C+ B5 q
result_png = 'result_png/com.png'2 r6 Q! a4 x) x7 q& T, q! B
start_time = time.time()
' Q+ j0 k+ i* Z5 k* O* |! c change_red2blue(origin_png, result_png)8 z# W9 l% U, {
spend_time = round(time.time() - start_time, 2)
. z( z3 w: L' a9 E) ?) \' p) w. G print('生成成功,共花了 {} 秒'.format(spend_time))
: l" `% W; v0 Q, z1 _9 E9 L1
4 y6 u+ T- s& `" f/ y7 R2- M* V. a/ J8 x0 l! E9 o" z! U
36 h4 X! N- @1 I$ K m5 o4 \4 |* T
4: j! U6 N4 @5 [8 x: M
5
$ s0 S1 |% y+ m6
1 _4 s3 [8 t# D3 T78 t+ ~1 I9 d( H7 B
8
: M5 l$ j( d L7 h) W$ N9
/ O% I; A* h$ y0 d10( S9 z2 ]0 R2 v. M5 g
115 [+ W; d! ?6 q( z
12# A8 n' ?5 d0 D$ H1 i$ t; I& U
13" p1 s( ]: N7 s& Q0 O
14' J6 \1 i, [/ }5 N8 |9 k/ Q! M% s
15$ v$ ^$ V4 J' k8 t9 y0 e) ]3 D
16
# Z! W$ U6 i) y9 Z; U/ z( J3 R; w17
9 o9 k u# O) y( t/ e18
. a! ~! y) v& E, O19" e; C4 {6 g* `' ]* B
20
8 r' ^9 n) Q; M, K( U21
1 m& L1 m! e/ ~! Q9 e8 ?! A! M22# z" L" t3 V! _/ T$ B& N2 {
23
: W4 N7 V9 @3 H6 M24
) N6 \- U/ l L/ ?0 ?259 K1 t& l# U# |+ U) p7 Y4 h
261 s/ Q6 W) r- l! N- _: S" g
27
! e6 j& i( U6 Q- ~* R. s9 _! F28
- |6 z. z* Z% h5 K& u4 X4 _29+ S- D6 t0 g* @
30
; J9 f3 h& D9 x, `5 F- U( q31
% D+ m6 ^% h& R; [6 Y# `32! N$ g0 r z7 ]7 H9 F5 X: V& R6 z
33
& g. d- E1 d" }% R344 C2 \: P, ^& \
35* @5 N2 |6 s% w5 { S$ r
36
. ~- K; |5 [5 }3 e" A' u37
% n" n( c0 r& p5 @' O r2 W$ C7 y38
) T+ u4 v* V# Y/ i39
& h9 w) M5 ] `! g40
; V% Z' v3 y8 R: }+ i41. \6 f! b# O% B
42
/ t; X/ a3 g5 i$ j43
+ [2 _! M; o7 o8 d' C44( s' v3 y* M6 ^3 d! Q
455 L2 u6 l% ?1 H# i' U3 Q2 @3 |
46
, j0 L, R0 M; V' l" |! y2 ~该方法质量较好,但一张图片大概需要12秒。$ R7 k7 G5 d5 { @0 M
9 N3 j7 @: G! ^/ w
- G! g% L/ D0 X! ]: N' ?
! h5 V" m$ _9 r0 N方法四: Background MattingV23 k) O, H% f; N' h1 f" ]
Real-Time High-Resolution Background Matting
* i* }5 O6 f* o/ P5 t# p$ j9 UCVPR 2021 oral: m, I9 F' F! z$ P/ N" ^$ J+ J
_1 ?; Z% y# Q
论文:https://arxiv.org/abs/2012.07810
/ |8 Y* E+ Y. C代码:https://github.com/PeterL1n/BackgroundMattingV20 \. G; N! {& t2 e+ B
8 v; L: C" b1 g% z" \" I U# `
github的readme.md有inference的colab链接,可以用那个跑2 n! m4 b8 Q) R
/ f) H' X( i4 _8 h- F& n5 U
由于这篇论文是需要输入一张图片(例如有人存在的草地上)和背景图片的(如果草地啥的), 然后模型会把人抠出来。' y& g2 L7 v- e3 _& m9 {4 m
L3 m3 p: \0 O于是这里我需要生成一个背景图片。9 l, @5 S* ?9 S+ B
首先我先借助firefox的颜色拾取器(或者微信截图,或者一些在线工具,例如菜鸟工具),得到十六进制,再用在线转换工具转成rgb。. V! ^1 k8 W/ l6 n; ?
) J; [8 u+ m* G" e% @
然后生成一个背景图片。
; f, v' e' w7 ]9 a8 k% k! M# T. d- B; \) L( |7 q, A# h
import cv2
7 l' o2 q' N) S$ K* r: rimport numpy as np! V7 W* e5 [' v' P) V
, A) N c3 e) y1 S7 P
- x# m' K6 S6 {- E' Q
image = cv2.imread("origin_png/person.jpg")
9 H! W( g9 i1 F! D9 q0 b! @; C% Lorigin_rgb = (168,36,32) # 可以用浏览器啥的控制台工具提取出背景的rgb值) o' s# ?8 z# Y( a) u. X: `$ i
origin_bgr = (origin_rgb[2], origin_rgb[1], origin_rgb[0])
; u" ^0 T: g+ m9 [. G- ^image[:, :] = origin_bgr
3 B |, V. N% ^+ A
8 P( ?; i" K8 C8 r, v1 hcv2.imwrite("mask/bg.png", image)/ R4 \( `" `* a& y
1
3 Q$ n+ z# F4 q7 V' R. _& k6 x% W9 ?2
7 J; `( H5 C+ O9 P& W39 O* v. p, a+ r8 ~! \1 \
48 o. I9 a6 Y7 x9 T0 `5 j
5
) F: l, D+ w8 R( W7 {" c- T3 c) K6
9 y$ v! v* f3 v0 V* S' K' X$ ~7
# l& R; v6 \2 \" u2 \* l& I8. Y9 j+ K: p! b) {
9+ Q' e, k v1 J6 s
108 I( P- {3 Y7 C5 R
5 D; r0 O8 O. |& I$ h/ Y2 w G1 n' t需要上传人的照片和背景照片, 如果名字和路径不一样则需要修改一下代码
- z0 j8 z+ J# |7 v5 a+ R: b8 V0 D' q) B6 I# m* {* V
src = Image.open('src.png')
- |0 z' x& {; |% C$ l# Ybgr = Image.open('bgr.png')
1 ~9 E" g) v7 ? [% i1$ |7 Y& D" o- x2 P8 f; x! ?
27 ?. i, G" q: y% u ?2 R- U
另外原论文是边绿底,要变蓝底,白底,红底则可以修改RGB值,举个例子,原来是这样的(绿底, RGB120, 255, 155)8 J. c6 X3 P7 ~& l
) b1 j2 h9 R$ ycom = pha * fgr + (1 - pha) * torch.tensor([120/255, 255/255, 155/255], device='cuda').view(1, 3, 1, 1)1 j- f! @. I3 j1 a. P3 a
19 r3 o- j( D. d( d' E1 @5 |/ Q
4 `; g, j; B( O# ^1 P
那么加入我要换白底(255, 255, 255),就是
: y: w* \: D; z! u5 O6 _6 Y7 P* L3 _7 f5 [4 j
com = pha * fgr + (1 - pha) * torch.tensor([255/255, 255/255, 255/255], device='cuda').view(1, 3, 1, 1)& K0 T" D/ S. {+ e6 m
1: v: j4 Q( D. \ k. G
5 g0 K/ \. J# ~1 W9 H) T假如像我换蓝底(19,122,171)具体深浅可以调节一下RGB,就是9 W0 d/ ^% Q0 B' \ v
: B3 V& }- h; b" Q+ A! W/ P5 T* j
com = pha * fgr + (1 - pha) * torch.tensor([19/255, 122/255, 171/255], device='cuda').view(1, 3, 1, 1)
- E3 b* s3 e) M; Y16 B) z5 J. x; W
总结: 其实这种方法从 任何颜色的照片 都可以 换成任何颜色的底。只要换下RGB.
% y8 {5 h. q# r
0 }! q1 c2 c6 z3 A, \/ ^ D4 \然后就输出图片了。可以看到效果相当好。不愧是oral。# |3 I, `- q7 H4 ?7 L2 k
% Y9 ]: g* _2 a3 A# }# Q! h' d% h; z; ?! m2 e# i
原论文可以实现发丝级效果
0 x% f$ ~1 H1 \, O
4 k5 ?! |2 r) X: L8 {( J7 P. d7 L# X; E' l5 z
# ]% r4 p9 `6 H$ F% P3 G+ B
* J7 u" U0 s5 }: n1 ]* ^' y
' w/ @ H6 u! E h% A" v R) @报错解决方案
" m: s( [5 f6 Acan’t divided by 4 / can’t divided by 162 u4 W! E9 D& {2 Q3 F
由于该骨干模型可能进行4倍或16倍下采样,因此如果您的证件照不是该倍数的话,有两种选择方案。一种是padding, 填充后再送入模型,然后出结果后再用clip函数裁剪。另一种方式是resize, 给resize到规定倍数的宽和高。
9 w! I( D% C6 a K A. [4 Y J: m这两种方案需要的代码都可以从这篇博文找到: python图像填充与裁剪/resize% j+ T' w8 a" U$ x f
————————————————0 T3 }- Y) ^2 k; T# A/ F
版权声明:本文为CSDN博主「Andy Dennis」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
, H6 r- X# \0 l9 L1 L+ ?4 j* u原文链接:https://blog.csdn.net/weixin_43850253/article/details/126376767$ E( b. n, W, \5 A |% }' u7 o
* P, y6 K: N6 z) W3 V% ~9 F( v& i3 U4 }; s+ W) U
|
zan
|