在线时间 1630 小时 最后登录 2024-1-29 注册时间 2017-5-16 听众数 82 收听数 1 能力 120 分 体力 569149 点 威望 12 点 阅读权限 255 积分 175968 相册 1 日志 0 记录 0 帖子 5313 主题 5273 精华 3 分享 0 好友 163
TA的每日心情 开心 2021-8-11 17:59
签到天数: 17 天
[LV.4]偶尔看看III
网络挑战赛参赛者
网络挑战赛参赛者
自我介绍 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
群组 : 2018美赛大象算法课程
群组 : 2018美赛护航培训课程
群组 : 2019年 数学中国站长建
群组 : 2019年数据分析师课程
群组 : 2018年大象老师国赛优
python将红底证件照转成蓝底 ! n6 O" ^! b6 e6 F
前言3 q& b$ ^) W6 X9 t. j/ r5 t1 S
emmm…快开学了,手头只有红底证件照,但是学院要求要蓝底,这可咋办呢。懒得下ps了。自己撸起来吧。; r* M, I+ _! j0 [) S
: H: J0 j3 W( A' B# y2 c
0 s }" v3 b1 r8 z- g& z
7 y* f' \1 O3 {1 {2 l6 s3 _ ' l f7 ^. C0 w
方法一: lableme j2 ^ S2 f9 [; H9 H+ P
lableme标注完后。得到一个json文件,然后将这种json文件转成掩码图.
3 \! M) Y1 H! G! D 1 s7 u* F2 S+ b# m! [
# 代码来自 https://blog.csdn.net/hello_dear_you/article/details/1201301557 j! n& Q4 s3 S* e) P5 ~8 b* H0 a
import json
; R+ P( G7 F5 H9 N+ i1 Z; O import numpy as np
/ ]1 J0 z2 n* w2 E6 L. \: T import cv2
% B* P; }* G# X4 r8 S. c# a7 _6 } # read json file
, I& `/ ?* H" K4 J! P1 ^8 [ with open("origin_json/mypic.json", "r") as f:
% p# J% x. y0 e) N/ R data = f.read()
! _: i# }4 P' m0 U1 [$ {' m
: c& |' X! w3 y+ g7 v' A # convert str to json objs6 g0 o& m F. B5 a! @) Y" S1 m5 r4 c5 @
data = json.loads(data)* j. a8 x% b& @$ k6 x& O
9 y( s& k, i: }5 ?4 ?. ~ # get the points f9 m+ N# Y+ q7 ~9 }
points = data["shapes"][0]["points"]2 _7 h- B$ P: k) P
points = np.array(points, dtype=np.int32) # tips: points location must be int32
. }, b& n' u1 L4 |; {. `" h, h! o
3 p8 C# v+ V5 E) v6 n # read image to get shape
( x ~8 `6 s" i7 j! Z# I+ U' M6 q image = cv2.imread("origin_png/person.jpg")5 V# _/ E: l% n# O6 C! B# A* L$ h" X% V
1 p7 S5 A; Z$ R # create a blank image
% x* k. V/ o% O# P mask = np.zeros_like(image, dtype=np.uint8)
' {3 v0 k3 U* H + w9 `4 X: W* Z" e: h E. b
# fill the contour with 255
o" w" s5 |) m cv2.fillPoly(mask, [points], (255, 255, 255))0 P8 r6 ?0 \- H9 `! C+ {
" N; b5 L0 e6 |. {4 ^ I
# save the mask 4 n4 }' s$ |) a& T- p
cv2.imwrite("mask/person_mask.png", mask)
5 `: a; s% w6 Q1 D8 K8 O* R 1
: T0 Z3 @5 p; @7 x, H 2. {- S% [5 }8 I" n$ _& \: @3 {
3
6 j, k3 u3 j( I3 y 48 k$ P* k1 T( ~) Y6 `0 j
5. x8 j& H$ {0 L: B2 m
6, s) O6 _- H) l% u6 M
7* d; N% | k6 S8 O; y' N- _: I
87 ^( d4 N* x: M
9
: z, D/ i2 J! s+ |' P, G 10
' Q; h& t* A' Z6 @ C 11: [! a h, j/ f; d( x' @
12
6 n4 N8 Y: V( s6 _9 U. P @/ p 13
! S5 c, n+ _. x 14! y& m* x' T* u; Z
15
9 p1 s7 _7 F7 e. s 16. r& Y( x; D0 u" Z+ T
179 W# ?3 W8 n2 b0 f* O: f* w P
182 _( f8 C3 Y1 a* d6 r/ o9 s6 u0 U
19& y& \) D4 G$ `( f) u6 |8 N+ D
206 `& v0 N% v& M2 H9 ^7 z# i
21+ a0 C7 a# R2 t) G0 y
22
: x/ _7 A; T: Z7 U3 H3 F' o+ s 23
6 n( b& S4 o* J 24. B) U! ^( l, B) a& V8 X l8 N+ ?
25
/ `" x: ] }5 H 26* V3 ~5 t. M3 l' ~ G
大概是这样:0 l2 {# r, C; |6 y
0 U; M. j0 K: Y* a+ e- _5 `; g . \0 }" U% N0 C: b0 ]8 O
然后利用这个mask生成图片
" I% ` O. X3 E! ?( t
+ F h+ ]5 F! F; f8 f% C # 参考自: https://www.jianshu.com/p/1961aa0c02ee
9 U, h' Q9 t% ]5 D/ H' S3 p- b import cv2- D9 w- H! H5 ]5 ]
import numpy as np
. }% I' [4 ]2 j0 w7 P9 B3 Z' L 2 K. U+ q- @" D" H$ o5 u
/ O5 v6 O ~( j1 T7 } origin_png = 'origin_png/person.jpg'
- ^- ~8 ~# r( y; r7 w6 Q # maskPath = 'mask/person_mask.png'6 m! E2 ~& N" t" K9 G
maskPath = 'mask/bmv2.png'. p2 w: x: m2 x2 W C7 ]
result_png = 'result_png/result_png.png'
( q# E* b2 y" Y! Z# D8 d% `1 \' X+ w 5 M% l, x! `, G R! H# n
3 m) |: Y( R0 l maskImg = cv2.imread(maskPath)) x" V) T. X3 Z) U H
img = cv2.imread(origin_png)' d! u& O$ I1 R" ~; R/ l
assert maskImg.shape == img.shape, 'maskImg.shape != origin_png.shape'
8 Y/ _: `0 a! {2 X& k
- l' J2 S& o* \- J3 f h, w = img.shape[0], img.shape[1]4 A0 n$ d" b. w7 W8 t: v) p2 t3 V2 k9 Z
print('图片宽度: {}, 高度: {}'.format(h, w))/ p2 B( p' ~% u4 \ v" O, i6 @
6 X9 [( r" H; o d" {
rgb = (19,122,171)( b- c5 C0 N" ]8 M
bgr = (rgb[2], rgb[1], rgb[0])
& j |3 E) l- \8 ]5 W # (B, G, R)$ B0 K* g+ I. {) t4 U
for i in range(h):& ~/ w6 c0 P# D5 l2 _
for j in range(w):* D* m5 S! @2 _5 w/ M0 p
if (maskImg[i, j] == 0).all():
, H+ J9 L+ |( i7 q) A img[i, j] = bgr
8 E) \6 z' I' a4 A }5 W9 g cv2.imwrite(result_png, img)
1 h$ R) B5 [, d& _! Z. S p, T print('图片写入 {} 成功'.format(result_png))0 |% D9 F$ C0 p: U1 ?/ d0 d/ w ^
1
; v8 r$ S5 G A" p# j0 L$ x 2% _* R, [( _, g: R1 k
3 k6 V4 U3 } ^) z; W
4( T) ?+ k# j4 L7 h+ u2 K, d& Z+ s$ \
5
, R* a, m3 f, |4 Y* b 6
, Z1 d- z' U9 S5 p* K. ?. _ 7
! r+ c0 }) q: J0 | 8
: i, ~% O, L, U' b& b# f 9
- X1 k* \) r% w H- p0 y 10% M$ d3 f# E7 m; r: D: h2 X
11
0 I8 y# U7 E- {5 X' h6 s# w5 E1 e 12' C# h. c L( n. y
13# i( R0 d# Y- S6 u* d3 f8 w
14
3 w6 y6 B" V( R' M2 R 152 W5 h5 t/ |1 j/ H
16; `5 g: F$ ~. X$ {$ |
171 J2 G) ~* Y- W9 \7 m
18
. @' [, a2 C& @5 X: W1 L4 C+ K 19
/ m( K, O2 U) Y: w 20
: J8 E$ }. C2 d: W7 ~ 218 F, G, ^+ B8 c) {2 N7 D& \
22
, r; i; q+ i3 D 23. ?* [0 E, X1 c2 ] }
24
4 S q7 l3 \' N. z 25; m* V7 o& w; K7 E2 M6 w4 t
269 ]: q, Q; h9 X; q4 E
27
# I/ q0 r- E& H* p4 h; r 由于人长得一般,就不放图了…. p1 h, |" O; s9 o
% q2 Z% \4 A2 X2 L! g
缺点:
1 [, J: s/ Q0 M, |2 j1 l2 }, k lableme标注时挺费力,并且难以避免人与背景边缘会有残留红色像素的情况。2 \! C; }$ X& @+ U' r7 ?
4 Z) G- D% B1 e : l) h3 j* n5 I/ `, w( z
$ `3 b3 i" D8 |0 ]! b# i5 ^8 U/ m$ \
0 ?5 { r: w+ O, N
9 R4 ^8 K1 X' m& r 方法二: 阈值
D( d" G, |' ] 该方法通过比较像素的RGB与背景的RGB来区分是否为图像背景。9 d; C' F ^# g; F! d4 T
. d# E: J( b7 } q4 v1 [( l Opencv
! l2 ~, t' d+ K import cv2$ u: l# N5 [& w: a4 Z1 b; b* ]
import numpy as np
7 h5 p: b% R1 c4 ^2 P' ?
& u5 x( n* c7 _5 I/ ^- W( d% J 0 I/ H7 R8 g5 \5 v
def mean_square_loss(a_np, b_np):' q. |' M% R% ?$ j; S
sl = np.square(a_np - b_np)1 |2 \+ Z; i+ L) x! S3 d
return np.mean(sl)2 L) E) v" s( {) @ o: [
7 J% m1 y9 f" _) p) F3 C6 Q/ G ; j5 ^+ @% ^9 W3 [$ o$ P
def change_red2blue(origin_png, result_png):- P3 k: r1 T7 M4 C
img = cv2.imread(origin_png)" M9 i. i, R8 w N. R" ^9 ^$ |& L
/ T& b0 K# u3 u) k" l
h, w = img.shape[0], img.shape[1]
* T1 {# c3 j ^ print('图片宽度: {}, 高度: {}'.format(h, w))0 \- i) a& w! Q; F0 K
1 [5 c) v" z$ n6 x" \4 z origin_rgb = (168,36,32) # 可以用浏览器啥的控制台工具提取出背景的rgb值$ @ \: Z4 w+ a% @2 B3 Q3 _0 o
origin_bgr = (origin_rgb[2], origin_rgb[1], origin_rgb[0])
' ^! P- x0 \/ P2 N9 z target_rgb = (19,122,171) # 蓝底RBG
/ o0 v6 g$ S, B! u1 K target_bgr = (target_rgb[2], target_rgb[1], target_rgb[0]). ~# @# g q( e( O
( x& u! L$ l0 {& O for i in range(h):
/ w+ E+ E, f% v; [ for j in range(w):
/ i7 F9 l- M; w% `; d* J+ B # (B, G, R)4 Z* |$ R: E1 r: }8 P
if mean_square_loss(img[i, j], origin_bgr) < 50:
; F, t2 @" z4 h' H7 d img[i, j] = target_bgr
* a% Q g# `' ?# u7 W; A6 O4 C$ G
/ S+ ^/ y- k- v/ I1 x1 Y& T cv2.imwrite(result_png, img)3 ^7 B8 E6 b; Y/ b8 ?' f! |
print('图片写入 {} 成功'.format(result_png))3 e) P- C! a7 k( w
: \0 { L& f9 m6 | ! U* V' \1 ?) j
if __name__ == '__main__':
3 w! d- [5 p- {9 L # origin_png = 'result_png/result_png.png'
) ?2 J" F, @6 n6 A2 d origin_png = 'origin_png/person.jpg'7 m- | _) T: {" M. b
result_png = 'result_png/result_refine.png') t6 r* r/ o+ U; S, {: k
change_red2blue(origin_png, result_png)
2 J# y+ ~/ h, f, u 18 q) B1 w5 ~* F
2
3 D5 l) Y r8 H; r: H0 F 3
9 T: n' S5 K1 A' T' y 4
3 O2 l1 c/ A) _* L4 s 5
! x- Z4 z. c% Y5 X: {7 Y# f 6( G6 J9 \" B* l) K' K1 w
7) M# I2 ?% Z, Q2 f. p9 E0 v* q
8 X( }4 G# n0 J+ u; C8 ]
9
/ g- `& q. p$ P5 l% f/ N* t% V! Z 10* s ?( d0 P1 } Z$ U o
11
5 l- }: ^) l7 |$ Z, W7 W 12
' ]/ J( U% Y, K, m7 O7 t1 l 13
5 ~- o; @" {* J) h! A8 V, J 14
8 M6 U8 b/ t5 Q6 E8 p1 [ 15; }( c6 o8 E# H& C+ s: ?# B; T
160 ~. t) k+ v5 M
17
: k: t0 F) q) ^: `" ~- ~* c 18
9 G) b$ j% T5 l: x4 k2 I# v 19
2 k* ^. j8 G) N( B/ g+ i2 z. u 20
2 c3 W/ i1 H7 C9 Q+ B# ?/ D& @ 21
, Q& D, s1 `1 z; M 223 e* V c! O# u3 j
23
2 V8 e: J; C' A5 B" H$ ]2 e& {* e 24
" k$ @5 j, y! {" p# L0 v. q* ? 25
3 g/ w$ m; \- Z5 E1 q$ B" A5 c9 B% s 26
) o6 l, F8 m$ I+ b$ T: v/ E( n" p 27
" [7 b' z. R) j' [- H1 b 28
3 }8 h7 P+ m6 |/ i& R 29
% L7 C7 @8 P* U. @4 b) ?% D 30/ |7 ^) Y5 s# j0 y
31( R z( S Z/ g2 `
325 A* {3 @' [5 k8 ~. J: k& W' F
33. n6 @# V; @1 g# c
34/ U' I+ S( X- B$ F$ O' X6 M+ H
35* p) M s( v2 k. _6 Q: s
结果人与背景边缘仍会存在红色像素残留( Z5 f5 z0 {( d% v z
7 E2 `: @- v, f$ n* U
7 d! |' `/ T+ X+ L. W- \ 0 H% m3 j7 k. r8 k) v2 `2 |
) k0 C* V/ T s3 t. F" q) m
: z0 n; z! v7 o" d; C PIL
; V' G4 r$ C4 x+ x @) ]' E from torchvision.transforms.functional import to_tensor, to_pil_image
# T6 K/ m! t& B) R7 B from PIL import Image
5 }1 h, V) S2 T- N! ]+ ] import torch5 j$ X/ N! r' f
import time
0 C* i- e* G! b' n7 c
# W+ I: H8 C8 T! y4 V
, J1 `6 Z/ Z; G; O def mean_square_loss(a_ts, b_ts):$ A2 ]! z, b* |% m" h6 x2 \9 i4 U
# print(a_ts.shape)
! D' j) V0 I( }& t # print(b_ts)
; _- C1 p: v# `2 S sl = (a_ts - b_ts) ** 2* ^$ a3 q0 F# w* @+ I9 l
return sl.sum()
! P$ g" A% w2 O" N: N, H& c2 I6 C ( [& A2 k" C4 u0 x+ p
8 c3 w. m) r$ B8 O
def change_red2blue(origin_png, result_png):" @ p2 x4 H0 b# x. R0 D/ u4 g
src = Image.open(origin_png)# o' g3 f; p( _# T4 S9 k) L
src = to_tensor(src)
- \, i" ^) ?8 D5 x& w: g( F9 j # print(src.shape) # torch.Size([3, 800, 600])
4 _- d5 t8 Z4 {; q* n, ^1 e # channel: (R, G, B) / 255: Z* E4 v% Y$ X2 S) J+ K, M+ a
h, w = src.shape[1], src.shape[2]$ N3 V2 q9 k" {) P. O1 k
! R% m3 ~4 g1 f6 |
pha = torch.ones(h, w, 3)& L2 J* S& I& Q, o/ c5 [
2 [& g+ a) a9 x# E bg = torch.tensor([168,36,32]) / 255
/ D: i0 d) g5 Y+ G0 T4 ^! G- l target_bg = torch.tensor([19,122,171]) / 255
& [/ i7 ?- Y) Z; O' D% X* j4 S # n+ I8 Z0 Y/ a) I
# C, H, W -> H, W, C5 n" c1 F+ c( s! {4 Z4 H
src = src.permute(1, 2, 0): ~) I3 o& ^1 a! H. S0 U
for i in range(h):0 e' V8 r; A% i
for j in range(w):% t3 C- m: c/ q2 J7 L! {; v
if mean_square_loss(src[j], bg) < 0.025: # 0.025是阈值,超参数
* e5 \% i& O' V# k/ n5 ^2 ` pha[j] = torch.tensor([0.0, 0.0, 0.0])
0 M" g; ^ {4 B8 W4 N; U' J* b
- _' w5 g# m6 x ]9 F- G' e # H, W, C -> C, H, W
& f# p- M( H0 n1 ? src = src.permute(2, 0, 1)
5 ~9 _) b% \ n! `8 H pha = pha.permute(2, 0, 1)
7 ]; G' u, ]- }# z3 y# z9 O9 K com = pha * src + (1 - pha) * target_bg.view(3, 1, 1)
* O, i. u/ ]& T$ {% ] to_pil_image(com).save(result_png): j5 m6 F; p6 y7 ?
2 w9 D8 G# [1 k- _: b/ C
6 w( Z7 \7 \' q8 X9 X if __name__ == '__main__':
0 E. H7 `: a# F5 a$ N; j origin_png = 'origin_png/person.jpg'* d3 m J/ ` j5 y( b: B
result_png = 'result_png/com.png'& ?3 o9 r/ `$ s+ K8 Y }8 D6 \
start_time = time.time()& @9 H9 \: a8 p: o% y
change_red2blue(origin_png, result_png)
* ]9 ?$ y# |3 q0 C. B8 u spend_time = round(time.time() - start_time, 2)1 U" g \. J7 m" W
print('生成成功,共花了 {} 秒'.format(spend_time))
' s+ l% B, Y8 A; X5 Y 14 R3 `. X+ I2 R( [9 [% P; r
29 W, U2 X0 n, r! j% ^6 [' u
3" O2 h9 D1 N5 b; _+ G
4! e, M- R& t4 N$ @
55 a5 Z% q% F- f& F0 n6 a
6
! R( k, N9 |. v2 y 7
* Y \; P; p" s# V, ^ 8
; [& ]( A4 o+ X3 C" S& N0 A 9/ }' m$ { Q3 T( z: k* C K* P
103 o" w( r$ e& c1 o' h- y) x; U
113 {/ T! b$ M+ U/ l! o! \# m
12/ p5 T9 |6 S" r
13
, r6 M& B: [0 ~0 F 148 ]: r1 R- {6 c3 W: Z
15
4 d' M+ i; ~: n. @8 o 16
: F* T4 r& @* r# {: t/ E1 @: k 177 D+ }1 x, F. P/ o! Z
186 Y! o" a2 Z, S( r! j E# @7 S7 c+ h
19
& ~/ p: W& P& p; e% |6 Z5 K) D 20
& h1 y& s& a0 Y+ }3 | 21' J$ w" d" W8 T X% ^. [1 f2 `
22
( B! A* _& Q% q7 `& G2 F 230 f0 W4 J2 y. j- I* K! b
24
! w9 i4 N. V9 s7 V3 _9 v6 H2 T; \. ~ 25
2 @' F4 H7 Z& U7 d( J% V" E 26. S. U& b+ H* V* R% `$ h* k
27
' z% R. `4 C u7 o; q 28
. n- R# u& h( E 29
! R8 x' T H `, U) j4 A) z _ 300 \, ^0 u5 c, h& Z
31' T! Q+ I" G8 R! L( O
32! d+ |9 T$ d o+ K# @. n! e
33
) J" k6 ]$ v5 O: |& R! V 34
' m5 N% z: W) z4 b' [- l 35
/ h, t; G+ M, {; R 360 F, w3 t0 L2 N; t9 \, o' y
37# F0 F2 D7 Z0 O4 T. m n% i/ s3 M
389 J! U- F+ _ }
391 Z4 ^% m; b8 n: i5 s
40( b5 z0 S+ D1 d) v- X+ ^
41
) W: E9 z2 U7 I" `' O, X. w% Y 42* b: C& t) k- c2 U6 i8 P/ J
43
$ r3 ?! {6 h# l6 G1 u 447 f6 c2 n0 Z. F0 {
45( S) w8 g/ O$ ?' x. q" n
46( r8 k. d2 r5 E) C8 }( P) F8 W' s
该方法质量较好,但一张图片大概需要12秒。
3 m, f6 m' v+ W( B / T: _! `: _$ X" n
1 ]. Y$ t6 `3 }% c- b$ {3 H' i 9 Z# p' [. S. K! L, m
方法四: Background MattingV2: o; y0 U9 _7 ]4 i# w
Real-Time High-Resolution Background Matting
0 f4 Y$ M3 o+ p. q5 k CVPR 2021 oral7 H; R/ c8 D$ _8 g
v6 S* Y3 }5 x! h, Y+ u3 S 论文:https://arxiv.org/abs/2012.07810
F4 d( ?+ O9 _+ F `! g 代码:https://github.com/PeterL1n/BackgroundMattingV2+ P' [0 K; ], j0 J
( v, K; |9 R5 D. M+ m, I github的readme.md有inference的colab链接,可以用那个跑0 M& }7 e7 b/ x: C8 D2 u
" O, r+ t8 P: d4 C& s 由于这篇论文是需要输入一张图片(例如有人存在的草地上)和背景图片的(如果草地啥的), 然后模型会把人抠出来。
; h: h- R: w3 ~* `
: K7 D, C+ ^ S/ M+ m 于是这里我需要生成一个背景图片。
' ]$ a5 N' X; p( `6 U- Z( { 首先我先借助firefox的颜色拾取器(或者微信截图,或者一些在线工具,例如菜鸟工具),得到十六进制,再用在线转换工具转成rgb。$ f' V7 |8 j, F
& D: Y% T Z+ i
然后生成一个背景图片。
9 U: i. K4 u7 B( `) `1 F- g% h/ `
$ I$ m1 n, b' ^ n z! M7 M2 Y& @ import cv2$ a7 T" m4 r' a6 W/ N6 ], L! v- p
import numpy as np. [2 u. \+ W) F) a0 w8 s
1 J& e- b" q- m: o9 O
. c+ a; w. v l# X3 ^" R4 x; N5 ^ image = cv2.imread("origin_png/person.jpg")
5 G; e6 l5 u# i5 `1 R$ d origin_rgb = (168,36,32) # 可以用浏览器啥的控制台工具提取出背景的rgb值
4 ? h# {3 k! F4 j; s9 L3 e origin_bgr = (origin_rgb[2], origin_rgb[1], origin_rgb[0])
( L8 G" y- Q: m* Z image[:, :] = origin_bgr! L1 G0 O7 Y9 M5 g* p, v$ Y6 C
7 @. H* y% }5 A/ F, k5 i0 Y cv2.imwrite("mask/bg.png", image)+ U3 n' E% R4 p2 w. E6 u4 N
1
( A3 _0 u$ U5 L% M( g 2
2 J7 c# s8 s6 Z# O. o2 C2 J 3
e. A. U; [8 ~$ r7 a3 V! y5 Q5 m) t 4
2 d5 l* D/ B4 `2 V. [ 5
. Y0 V- K! R% ]) m. S, I' m 6
% }( K0 Z, ?, i8 O 7
. w8 k1 A, e) r 8
4 v2 q8 ?( N8 I9 G. Z; ? 9# x* a$ O# {" E
10, f# k! H0 G5 B1 K4 g4 s, _# u2 x0 z
2 `1 q/ x& c6 }- ?5 @; d 需要上传人的照片和背景照片, 如果名字和路径不一样则需要修改一下代码
2 p; H1 X9 Z ^2 P6 O
5 @+ p* D4 H1 e2 E" Y9 {+ Z src = Image.open('src.png')
3 s- ]( ^' O1 Z4 E- T+ d9 F' I bgr = Image.open('bgr.png')/ n6 L! N. ~; ^& y9 i
1. j5 a+ Y# |1 Q/ z
2+ V6 R$ J% V) ]
另外原论文是边绿底,要变蓝底,白底,红底则可以修改RGB值,举个例子,原来是这样的(绿底, RGB120, 255, 155)5 C! m9 I7 t9 Q0 z, n, S7 i- f
: J/ M+ u8 D- P
com = pha * fgr + (1 - pha) * torch.tensor([120/255, 255/255, 155/255], device='cuda').view(1, 3, 1, 1)5 u' t$ j* s6 o0 |9 w- H
1
( j' A- }2 J8 a3 _ : x% N- D3 ?0 a* b9 g
那么加入我要换白底(255, 255, 255),就是& h7 F; K/ ^) }, b
5 P+ S: Y. \' ^2 m& x com = pha * fgr + (1 - pha) * torch.tensor([255/255, 255/255, 255/255], device='cuda').view(1, 3, 1, 1)
- Y" q) T6 m5 t) ]0 R) K 14 A( h) @$ d- u Q
! M/ i. R. i, k; ^$ a" i
假如像我换蓝底(19,122,171)具体深浅可以调节一下RGB,就是
4 f3 p7 q# X# V2 X6 O+ N. }
. p& \4 n& J- q k% h0 y" E* V com = pha * fgr + (1 - pha) * torch.tensor([19/255, 122/255, 171/255], device='cuda').view(1, 3, 1, 1)
4 H! h1 m# c* K j7 x, X 1+ h/ o+ A! \0 u5 G w9 ` T
总结: 其实这种方法从 任何颜色的照片 都可以 换成任何颜色的底。只要换下RGB.- w4 R. Q( ^0 c' P
0 R8 E& u" j# ^: C
然后就输出图片了。可以看到效果相当好。不愧是oral。% r& e" I& w* b! }2 z- ?
7 ?# W8 a- ?, @9 q$ C- ?9 ^* d 2 Y6 p# W/ C; B8 _7 j! @4 Q2 [" z
原论文可以实现发丝级效果
8 t8 o# d6 ?7 V+ R- G: u' v 0 @ t* c3 _# |8 E( s2 k4 ?
, H b+ X; I% i% M7 T' B( o( z
# ^& {: q$ }2 r; b( E0 x8 V
* F, E, z: l) Z0 H. J2 I) K
" l9 q" v" P1 F$ i 报错解决方案
& o, ?6 G1 i: f7 S7 _8 H can’t divided by 4 / can’t divided by 16' \% _- T% v9 t( I* }% ^
由于该骨干模型可能进行4倍或16倍下采样,因此如果您的证件照不是该倍数的话,有两种选择方案。一种是padding, 填充后再送入模型,然后出结果后再用clip函数裁剪。另一种方式是resize, 给resize到规定倍数的宽和高。
, |( D" P3 J) z! r& B$ J* a& S4 ^" a 这两种方案需要的代码都可以从这篇博文找到: python图像填充与裁剪/resize
( W6 E1 |: n% e& R ————————————————
" }2 ]4 m$ ?1 X+ W 版权声明:本文为CSDN博主「Andy Dennis」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。; U) q" i0 b: w" E4 `% m& ^
原文链接:https://blog.csdn.net/weixin_43850253/article/details/126376767
% t: s5 U n1 O1 j* K
# u0 R$ u! P" J# A' _4 I+ E
8 R, s9 U: Y. n6 W
zan