- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 568940 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 175905
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
python将红底证件照转成蓝底2 M H4 _1 |! E2 ]
前言
R) }: q# i2 Z) D" qemmm…快开学了,手头只有红底证件照,但是学院要求要蓝底,这可咋办呢。懒得下ps了。自己撸起来吧。
4 \- M- F+ [$ r) f4 D
: Y# E, V* N9 {6 Y' J7 k$ |4 v" o) Z+ g9 _3 ]" f
0 L, X8 D* y6 L# I/ w; n1 g& E
3 s2 t5 j8 \ S) y1 p& y5 Y2 v9 G方法一: lableme
5 [* c9 g7 ?1 [8 }lableme标注完后。得到一个json文件,然后将这种json文件转成掩码图.
* I! K# ^/ w' [$ T7 D* B% y1 e. v% \ H5 Q) E3 y5 g8 L
# 代码来自 https://blog.csdn.net/hello_dear_you/article/details/120130155' l% d' x' h2 V+ o# R$ r3 C9 x9 ~
import json
2 ?5 @8 {5 C3 M8 i7 N+ F; Himport numpy as np7 j& I" H R1 W- H$ ?1 J# H
import cv23 Z1 n* p @1 E" y/ M: ?5 r/ ] i/ {
# read json file6 H4 u' x$ b; n" L4 J
with open("origin_json/mypic.json", "r") as f:
* z9 Q- l, x+ J data = f.read()+ H! \/ t; v/ q& K. A3 G$ {5 ^$ z5 \: Y
) ]* V. p! l& T- Y- b
# convert str to json objs+ E4 Q. q% g3 j+ _/ w
data = json.loads(data): i9 u) m( {; ^% ]3 n2 c; M
( g; i% Z1 s4 F r% d7 Q8 ]* @( _# get the points
9 Q- B) N6 C1 K j: ^8 |% W6 B. opoints = data["shapes"][0]["points"]
; X5 ~) G1 Q4 V4 K7 s& npoints = np.array(points, dtype=np.int32) # tips: points location must be int32
( _/ W o1 O- }! t, W( |+ {7 l5 E! n* _' q- K) k0 W3 j- T" k' P
# read image to get shape# J1 M) L& X, W6 R6 l! ~6 w
image = cv2.imread("origin_png/person.jpg")2 ? U5 `) x7 U- f
" ?: Q) g! N/ l! e4 c% w: ?# create a blank image
7 r% u3 H$ n$ d- X# _. ?mask = np.zeros_like(image, dtype=np.uint8)+ n m0 `6 F3 M! m7 `* x
" y1 W1 ~, F5 M- k1 C# Z
# fill the contour with 255* {9 s O$ ?! q0 K' x
cv2.fillPoly(mask, [points], (255, 255, 255))
, D4 @/ L) ?* h) g: z. c$ S; j) C8 I/ @2 A( R
# save the mask
$ M- X7 V P' H! ?" s5 o3 jcv2.imwrite("mask/person_mask.png", mask)
( u0 _$ S& Y! @1, ?9 Z+ `) `: Y# j1 q
2
8 S& b9 x! M. P w9 l7 P7 d8 b& E3& A2 N+ R- ?2 z) H5 j7 C- @7 l
4& U6 ]- ?, }+ @: a
5+ \1 L! \6 B- @9 H9 {
6
. d1 l8 \8 s3 \4 {7
, g9 z& l% |% u9 g4 N8) {2 } Z# ^& P) |
9; X, u+ M( ]( {8 d: W* c
10
3 K1 g) i$ a5 {4 H/ O11
; n% X& U: H0 U) Y12
0 ]0 d. H; e# v7 D; T, e13
: y6 h( r1 Q! v) e14
% k6 |& N7 \$ I7 C15
$ M# Q: e7 `" r' z N9 K1 j16' A6 H$ y: [: W% q$ y- r
17
, R! e/ ~3 d Y18) M/ _( c, x" g k
19
u; _1 H# z6 ^ K* U4 _20! m: }' Y! g, S! z
214 |: R- k; e5 t) [, H
22+ z- x0 V- _! i
23
7 b3 V5 U9 Q7 V3 B$ ?( U$ P C2 e* s248 B3 t& H8 U$ }# N8 {- P4 ^
250 J; ?) X+ k- o+ o# ?% a0 Q
263 V5 h1 w1 r' @5 L4 `% m) l6 i
大概是这样:
4 s- _+ U2 `4 ~5 w2 z$ l8 Y g
% U" G2 ~- J' B9 Y5 L# ^6 H
S: V* `/ e' a8 p% Q1 j. m然后利用这个mask生成图片# T* ^9 B/ s4 w+ C- s, V+ [
6 [9 [1 ~2 I, m: @! ]) |3 q# 参考自: https://www.jianshu.com/p/1961aa0c02ee1 i) y! j( W, K: @9 t+ ]
import cv2( N! ?4 m1 M" `, z- I
import numpy as np' t; j. u* a, J! Y6 t( [
3 q/ v$ F. k5 R3 D
% n5 F& U/ V) x; Q$ y! h
origin_png = 'origin_png/person.jpg'
+ i" A4 m" V" ~1 X. C1 ?/ M# maskPath = 'mask/person_mask.png'
& ^- q$ X8 `; x4 a, C+ @/ i( {maskPath = 'mask/bmv2.png'- A5 w% i6 \( y+ t
result_png = 'result_png/result_png.png'$ v9 D5 P7 n; c9 b6 f
3 k2 _3 m8 G0 h9 b% G3 |' n9 n1 n* i# {- d
maskImg = cv2.imread(maskPath)
" \8 T8 H4 C, X: f) himg = cv2.imread(origin_png)
* T, i* l- w( {. bassert maskImg.shape == img.shape, 'maskImg.shape != origin_png.shape'% d m2 K, n; I! D- F
6 q$ x; X3 z8 B' {9 Uh, w = img.shape[0], img.shape[1]. x# t: p& W" x1 H: L
print('图片宽度: {}, 高度: {}'.format(h, w))
4 g" _, {# l! n6 s& y$ o! K$ T" X4 D1 ]. y1 ^, O- `" }! O# N
rgb = (19,122,171)3 ~/ w, h. }5 M; Y: z
bgr = (rgb[2], rgb[1], rgb[0])
, x, @8 B% \8 k$ [" L; V" o# (B, G, R)% J# N d7 ^" |
for i in range(h):
t. Z) i7 A6 r. b" r6 A6 r) J for j in range(w):. r( s/ h9 ?0 a# C! P" Y
if (maskImg[i, j] == 0).all():
8 A: n4 t: A* ~# }) j% {! w img[i, j] = bgr
# r C' ?' P0 a# ]% ?* ?+ Ucv2.imwrite(result_png, img)
% e5 X; K8 | o d7 ^print('图片写入 {} 成功'.format(result_png)): y1 [2 J; V! q, C9 y
17 Q$ x$ ?) ?6 r7 Y( i: M! p; m
2
- f }# q$ H2 t, K/ n33 c4 \9 U/ W9 {. `- T- r1 |
4
3 T9 f* ^& C7 K5& p) t: p V" U9 z/ V1 V( A
6) _+ t9 {& C5 ~9 p
7. @4 F! F k: Z" Q4 }, @" e
8
i( g0 i2 q+ p: G: w4 D8 ]" e90 ?% k& \' |( M) E% i8 T
109 F" g9 y6 j% l7 N
11" ]" Z/ ?8 o: Z
12; d9 _) d3 ^2 |/ Z0 N+ y m
13
0 u; @- N3 s) L0 T7 b14
6 @! U% ?, F3 C- u- u15" G$ T) O/ V- |7 B9 N
16
+ c* r% X" F/ \- H1 @4 J H3 z# K! H# E170 `# s# e# K% ?" W
18' r) h1 z/ I8 z! @1 m
19
! e. c$ g4 e q: I$ @20+ ^$ B0 g+ A& l2 d
21
7 c% [" l$ ]! o5 @" h22
. D1 u+ U3 @7 S. D23) q. R: O, W4 A
24; ?2 i/ I# G3 @
25
; ~. A9 [ m1 y2 E$ X6 n264 k0 A5 f8 ]5 l% O
27
1 o n; B% R, b- S$ s! t0 h7 ^& M由于人长得一般,就不放图了…
: [. j* C! I# T2 N# j' b% ^- C2 w$ k- y9 k2 U( t4 q
缺点:/ b3 F; G- @2 I/ P4 w
lableme标注时挺费力,并且难以避免人与背景边缘会有残留红色像素的情况。
* ~$ H0 C2 Y6 @- ?: V+ `' q
T# _$ E# {& t
0 H9 S/ `* B8 `! w" e: j7 ]8 P
! Z9 I' C! ^+ D/ Z$ m* E) n
' X8 `# `) ^0 J8 |% [
8 E( W; p9 j' h ~0 H, f方法二: 阈值
5 H/ w6 t+ N1 T该方法通过比较像素的RGB与背景的RGB来区分是否为图像背景。1 c8 Z" _5 Z' i% p2 p! f$ d+ b
; L& Z* n# A' S0 s/ dOpencv: a$ j3 G2 v1 }' {
import cv2
) k& v) y& ^( Q. @4 l1 K& [import numpy as np$ A' D) s6 I2 w+ x# [" r
0 x3 z9 }' F! m5 t8 }& }% S; c `
. m7 L/ w4 h- r! y" l9 T0 F9 |4 k: K
def mean_square_loss(a_np, b_np):
$ A5 N! s, w" H$ I. o; {+ G sl = np.square(a_np - b_np)9 `! [) l) C4 A% H# L1 k
return np.mean(sl)" f6 q4 b& t* }, c4 g2 h
$ o# }4 A0 Q2 E
. \$ B1 o' B" T; M: fdef change_red2blue(origin_png, result_png):3 e3 z8 d$ E; j! l1 h( A6 [. l6 T
img = cv2.imread(origin_png)' ^" n- {8 \4 d& f
- a7 i5 C, e, e* l1 m h, w = img.shape[0], img.shape[1]
* E9 @& ]) a, t/ e9 \* z print('图片宽度: {}, 高度: {}'.format(h, w))3 v0 s; @+ O8 R: Q+ I L% n
4 J% l% `" K4 B# R: k; \; H9 R origin_rgb = (168,36,32) # 可以用浏览器啥的控制台工具提取出背景的rgb值, V& N* i# Y- h+ X2 j& P O
origin_bgr = (origin_rgb[2], origin_rgb[1], origin_rgb[0])
6 K3 A! {3 K( d9 u& } target_rgb = (19,122,171) # 蓝底RBG, {! j6 n/ J. o
target_bgr = (target_rgb[2], target_rgb[1], target_rgb[0])
% n4 R/ U' r6 W/ p) s* o1 W6 U3 C$ h9 b! n0 a
for i in range(h):
# t! L& I8 W% Z3 { z k for j in range(w):' I" H/ U R9 |! {3 t
# (B, G, R), Q! R5 F$ ]9 F3 u0 U5 I
if mean_square_loss(img[i, j], origin_bgr) < 50:
! r2 E0 o& v. u `1 \ |' N img[i, j] = target_bgr
1 n3 p+ ~! K& @8 \3 F. U; L1 H0 s/ o2 r# v; F; \9 w3 Z/ C
cv2.imwrite(result_png, img)$ M8 U& h# ]* A$ ~9 O- R
print('图片写入 {} 成功'.format(result_png)). D2 g* M" x* H7 n5 k1 L7 }
8 V) u( Z. w) i) y+ N" ?% `6 z }* |* z, }
if __name__ == '__main__':
9 C& F5 g# B7 m # origin_png = 'result_png/result_png.png'
U1 w* H- w3 u' d6 t. p origin_png = 'origin_png/person.jpg'2 d' T8 n: q: u
result_png = 'result_png/result_refine.png'
# T* q; _0 [; v1 C/ O5 |* g" r* C% ] change_red2blue(origin_png, result_png)
4 G$ ?& }: U0 ~. C% A) X7 X18 J, W i- o* p
2& @* p3 |" k* a; q* V4 k
3
% S; O; n7 Q7 f6 r1 l4 |44 b9 u, J8 [) u/ A. F; ]( e
5
& C1 X; F) W9 T7 `' o4 U: ?6
5 d S/ E3 p3 m4 o9 S0 f76 Q. ^, a( j9 B! |4 u( v% D; Z7 n3 z
86 s1 z' e, J: @2 L' F# n
9) ^, C/ x( t* W, ^
10; |1 m' T3 T) Z/ Q+ D# _
112 B) v* G* X, S) n6 u x
12: R, ]: X- n. n
13
2 L: P% Y/ x# K1 w, ]14
7 N9 w* r6 Y4 a/ P8 T1 d9 J+ C154 v: F$ P7 @! j" [+ y
16
& n( a; Z2 L& E4 ] R( C17
. u* v- E* Z7 N18
3 l1 k3 {1 T2 s% U- N4 Q5 b19
$ R5 a9 @+ ]0 _8 m1 n9 W203 J* W' ^! H1 t5 Z
21$ |9 T. H8 A* \9 S0 _- f1 V
22
4 o/ g1 V" v! E; w23
; t. l, U1 A7 s9 f5 n( W9 B6 r5 U24
8 a3 e8 m! E$ l& B, d4 b25) T0 D' \" D% T& o: ?) m: m
26
1 x) P' l2 q% L: z& m7 o0 K4 \1 p2 {27+ J. C7 \. m2 z! G/ ]$ q2 t
28* z7 U/ x/ Y- q3 |0 y
29
7 q3 i* n' ?( d5 W, }306 I! g) r9 J' { z1 J& Q
31: b8 U7 v$ B2 T
32
6 \; `* U' [5 @3 d33 F% n# I3 K& X) O" h$ Z; w
34+ h& N; p! U# Q7 z) X* n( W# B$ b! ^
35
3 n$ i9 e. i0 @: j结果人与背景边缘仍会存在红色像素残留
. @, {4 k1 z. Q, M$ I; F) @) o* H% W
8 B, Z. _9 }- r
( ]' E+ I6 Q; v8 m9 ]" n' t! ?. q/ V
9 }6 T( F. x1 ` N# ?; t$ a: N$ s$ J f, {
PIL% Z+ R5 ~% K* B8 f5 P- c
from torchvision.transforms.functional import to_tensor, to_pil_image
" Z/ M% ^2 F0 x. Q- _ nfrom PIL import Image
+ }, ~6 K9 [. wimport torch5 Q$ W7 H6 g, F' u, r
import time1 {5 f- m" G* Q2 n& ~9 i0 W/ p
' R) y7 @, W1 p5 o
) o4 I6 [. _! G% T. p" ^% N; z+ [) ]def mean_square_loss(a_ts, b_ts):
8 M* {; {+ `7 C6 B # print(a_ts.shape)* z3 G3 H7 C6 n+ {
# print(b_ts)" k( U& ~5 n: B0 F0 I5 p6 s
sl = (a_ts - b_ts) ** 2" ^3 a3 k. @, j8 W8 b# x
return sl.sum(). g$ k4 n0 ^0 u0 h" T
& J0 y9 E7 ]5 U) G, Y9 `5 v) e
0 q+ F# `8 Y( J8 G
def change_red2blue(origin_png, result_png):: G. n4 R; y( s F
src = Image.open(origin_png)6 Z' _7 i% A. t" C7 ^: `
src = to_tensor(src)8 t D& l; p1 h/ n2 K6 v3 o! C
# print(src.shape) # torch.Size([3, 800, 600])
# G5 n) z) S5 i" y( b: D # channel: (R, G, B) / 2557 l4 h; M) m9 [$ @1 |2 l7 `
h, w = src.shape[1], src.shape[2]8 L5 M3 H, R8 m8 d9 S0 P1 r
' N6 b, a- U5 Z
pha = torch.ones(h, w, 3)
$ R: u6 Y# @3 E' D0 `& ]
* `! n8 ?* `) }" q' w" x- W bg = torch.tensor([168,36,32]) / 255
, H5 g* Y' B- U0 ~ e' k6 \ { target_bg = torch.tensor([19,122,171]) / 2556 k! c$ L' y1 i8 I4 @4 [* I% |; a
0 o1 k& G* z6 _; U# m- k, B7 J# b U # C, H, W -> H, W, C, S0 L! Z f3 _# W2 F
src = src.permute(1, 2, 0)
/ t8 k. k" ^9 K+ k6 g: t for i in range(h):
* `& _$ c' O+ Z; ^( C' ~5 b2 U for j in range(w):0 A, T1 v* g: w; h- U% {' S; _% [
if mean_square_loss(src[j], bg) < 0.025: # 0.025是阈值,超参数! Q g, c2 t$ i! |; F5 d$ r
pha[j] = torch.tensor([0.0, 0.0, 0.0])
; K9 f2 b$ N' F2 h/ ]! {/ Y* d: J9 C. |. y. @5 m
# H, W, C -> C, H, W
+ ]. g# t3 x& M! Z' f/ E& t src = src.permute(2, 0, 1)' J6 P% [+ J. g
pha = pha.permute(2, 0, 1)
+ Y% V3 y) g8 t+ d com = pha * src + (1 - pha) * target_bg.view(3, 1, 1)
9 m1 R- S: v& Z; \4 F to_pil_image(com).save(result_png)4 @: X5 a1 Z* I$ B( |
4 T4 _) B% d2 L. o; s& z1 N
9 A. H( `/ Y6 n6 r
if __name__ == '__main__':6 J. r) b, w0 @% ~6 k9 W+ _+ N
origin_png = 'origin_png/person.jpg'
$ g& R& F, F4 | e& ^. ?* T result_png = 'result_png/com.png'0 k0 L* P5 j4 q2 H
start_time = time.time()
% C4 {6 V( O" p7 a; h( R1 | change_red2blue(origin_png, result_png)( i/ _" _+ h- f( p! q6 C
spend_time = round(time.time() - start_time, 2)+ g5 s4 H9 m9 U
print('生成成功,共花了 {} 秒'.format(spend_time)), u: {8 z0 k' t) @
19 u9 J$ w6 o9 }3 j6 E
2
/ X w2 y) m. K: h& S/ B3( V0 f/ m! ^! s
4/ S/ m$ P6 {" r( I# q) y: v8 d
50 Q! z& `3 d m2 z6 z
6% t& p7 w6 E7 b% ~- Z; z
78 V! A3 b* F2 `' e# W/ r9 v
8
; C4 a. j) {+ a; ]' ~5 m9
8 I$ ^$ G; G+ `# P103 L0 ^9 [, x: w/ B) \/ ]6 ?
11
# q* c; Z+ G# Q' k, v7 J5 L12! @* C- \+ X @6 h/ D: O
13" `9 M! O' }- u0 \4 s: `1 F8 H
144 A# w0 ?" ] ]6 F7 t1 M
15- V. a! E" z' P
168 M- l$ b- y# O1 @$ s) Y. m. }
17
0 s8 w- L$ e6 d1 Q4 S18
4 N+ [( W7 A' v1 b: Z6 d' d2 K19
* Q; e C# v/ ^ f; {! M7 n g2 |206 U/ `* U9 d4 A- q! q2 c1 t. f/ \
21. `$ e) A$ X) g3 w/ S
223 g8 V- g4 Z' O p6 k( F& Y
23
2 f3 O" k4 u8 A8 r# E& M24
# B9 S, A3 G0 `2 Y0 p2 b251 E( R# j" R. s: X
26, e0 e- [' E* F2 P
27- T Z$ z( L) U0 i! R$ j
28
: D7 d4 L& l# P5 C' J" ^/ q7 D. R29
2 L3 y' S5 ~# G) q2 V- p/ t, \30
# ] C! j: a+ T7 J6 y312 X% I& B: l: n& \
32
* z) p. _! T0 M5 j# j33
: ]. T- F7 g: Q) r" _- `- s345 r+ P/ U6 Q2 p, J1 M
35
2 |+ D. B7 X4 u9 j5 g8 W36) m9 b* Y2 p. t" w
37! J Y3 K1 {" a- i8 W4 C
38
7 ~& G+ i8 }4 p* H3 l39" Z( C+ O# f; X1 I8 E
40/ w/ |+ X) R7 U$ p
41
0 e# I: e. j) o+ l( i; ]* b: y42, n1 A8 l, C' G" v7 f
43' s% R1 ~- I0 M, M
44
6 Q% P: `6 { b- d45* h) P, X* O W
46 j6 f9 g" P8 \
该方法质量较好,但一张图片大概需要12秒。" U9 K! U+ w, e% t6 T
' ~( ?! Q, U, X9 y' r( x
- e8 l, ?: @0 C+ I" V$ w
8 ^4 U" T! M( |8 N# I6 r
方法四: Background MattingV2
. U5 s: v/ h' sReal-Time High-Resolution Background Matting' D2 a( L& Y1 \8 L
CVPR 2021 oral
2 _3 b3 N! ]" g& M/ [3 [+ y
! H6 `3 ^ I! N4 _! |0 P0 `; G论文:https://arxiv.org/abs/2012.07810
1 R3 J+ C) f O c代码:https://github.com/PeterL1n/BackgroundMattingV29 d Z& B8 a. x
0 ^( _2 c" Y Q. l+ u- w, f+ r a
github的readme.md有inference的colab链接,可以用那个跑
# U. z/ q) F c' t
- ^" E# F! [, x/ O由于这篇论文是需要输入一张图片(例如有人存在的草地上)和背景图片的(如果草地啥的), 然后模型会把人抠出来。# O9 C! l+ Q5 r# M
8 ?& f. k7 Y& g6 Z5 w/ f9 {9 e于是这里我需要生成一个背景图片。
3 _2 d. o' q+ d) `. h0 z首先我先借助firefox的颜色拾取器(或者微信截图,或者一些在线工具,例如菜鸟工具),得到十六进制,再用在线转换工具转成rgb。
7 P: u- g: C2 z$ h0 T3 n7 ~5 q. l7 Y. d
然后生成一个背景图片。5 O4 h0 I7 A$ \1 o1 s
" z4 X, k# o# z% L# C4 s6 A
import cv2
, s1 [; e* y$ r# @import numpy as np3 q- w9 ]3 H# X
& V3 X) D+ _- V- @. T4 i. d9 n
- ], s1 h! Z0 R, `) A: [image = cv2.imread("origin_png/person.jpg")
/ f- i5 R2 u3 ]origin_rgb = (168,36,32) # 可以用浏览器啥的控制台工具提取出背景的rgb值( P0 M# c) l9 x5 i) ?" W) D) a3 }
origin_bgr = (origin_rgb[2], origin_rgb[1], origin_rgb[0])% p+ B) {( t0 z" N5 Z B: Z
image[:, :] = origin_bgr
! k% c9 i3 e8 ` x: @. D1 T5 U9 V' y6 s# I
cv2.imwrite("mask/bg.png", image)3 x; n& ^/ O/ f$ {: ?
1
5 E9 S2 A' I, v: V. d2
( h7 Z9 d$ ~0 N% f9 U37 n3 J6 d9 {3 k
4& o# L) @! h3 O3 C( _2 h3 F- P
5" t" {+ U0 l6 [0 _+ I7 Y9 l, z8 Z
6
: c6 P+ k* m. f3 g' ]7
/ g Z$ Z5 n( y, Y1 @) }8% t+ Q: I+ d/ S2 E
96 J8 V4 Z2 L& q* L9 ~$ d- e6 l
10: R& H$ z, o$ g$ X+ P( }
0 n3 I$ }; t/ B# ?1 `9 n需要上传人的照片和背景照片, 如果名字和路径不一样则需要修改一下代码
# |4 _6 O1 p. [) F. l6 x- a+ A) e8 l- ~# i/ q
src = Image.open('src.png')- A2 a7 U$ m* g
bgr = Image.open('bgr.png')
" D& y3 h& D0 L& v1
" q. k2 `/ V3 A5 c6 v2/ ^2 X& u4 @2 s
另外原论文是边绿底,要变蓝底,白底,红底则可以修改RGB值,举个例子,原来是这样的(绿底, RGB120, 255, 155)
3 i, b! Z% I4 F9 @/ L- W
; U& ]" \% |% Z) {( ^- scom = pha * fgr + (1 - pha) * torch.tensor([120/255, 255/255, 155/255], device='cuda').view(1, 3, 1, 1)
7 x+ L2 D& Q& |- V) i9 a: l- C16 c q* C2 ]$ y* r* _) U' n( g
' P; R+ \! b, C+ P1 B- W9 B那么加入我要换白底(255, 255, 255),就是
( _ ~, i8 _/ r1 }& B9 d4 a' D0 F+ }6 C+ O3 h. F G+ h
com = pha * fgr + (1 - pha) * torch.tensor([255/255, 255/255, 255/255], device='cuda').view(1, 3, 1, 1)1 V0 W3 A* k3 u2 B* r- q; V
1
9 N* m6 f! S$ k0 G- m, Y% k5 _+ H C3 R1 i( V2 D- z6 Y* Z8 f5 }
假如像我换蓝底(19,122,171)具体深浅可以调节一下RGB,就是
! g2 A# t- Z1 P" w9 ~" l# L$ u/ {8 ^* O* n0 \) B$ x: e
com = pha * fgr + (1 - pha) * torch.tensor([19/255, 122/255, 171/255], device='cuda').view(1, 3, 1, 1)
8 V: R1 o) G* x1
, p7 B* W+ U# g, E7 j! r/ c |8 K+ a总结: 其实这种方法从 任何颜色的照片 都可以 换成任何颜色的底。只要换下RGB.
7 |3 A2 U4 E: \7 K3 F& w3 R' u0 e! }
然后就输出图片了。可以看到效果相当好。不愧是oral。
0 } s G7 ]3 M9 v9 w' a
: a5 H+ \& |8 X7 E0 F+ D. h! T/ o
1 M0 F4 l- c) ~ _原论文可以实现发丝级效果6 s4 c2 g- e: b3 K7 h+ h6 ^) ^# A3 G% b
; b; _9 Z' @$ o% Y% H" V# D: q, A
. A* F- W, V9 ?( T* g0 U$ P& {0 u* x; O4 Z2 P, X. s9 l
7 h: b5 L4 t6 T
0 W$ B7 P0 c: F3 E5 M/ F6 k! x报错解决方案
$ T3 ]# P5 z$ ?8 c4 s8 Ecan’t divided by 4 / can’t divided by 16, {- I, W' `* y& e# o; y+ ^
由于该骨干模型可能进行4倍或16倍下采样,因此如果您的证件照不是该倍数的话,有两种选择方案。一种是padding, 填充后再送入模型,然后出结果后再用clip函数裁剪。另一种方式是resize, 给resize到规定倍数的宽和高。9 E% `7 F8 h" w' `, O
这两种方案需要的代码都可以从这篇博文找到: python图像填充与裁剪/resize5 h; G4 h [0 }6 A2 c+ Q6 i7 M
————————————————: n% p& h$ l9 @0 }( w. N9 D! L
版权声明:本文为CSDN博主「Andy Dennis」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。% T6 P, u( @2 [; q! r/ t' S
原文链接:https://blog.csdn.net/weixin_43850253/article/details/126376767
! T7 L. g2 Y' G4 R' \& C
. R { ?$ O: x# M9 S
$ B6 ~: E' b' ^5 ] @ |
zan
|