! ^, b1 R, h; p* \* a1 q* ?9 P' @4 @* S0 K. ^0 q3 G+ m
PIL7 j2 M' l" n5 Q6 f& w
from torchvision.transforms.functional import to_tensor, to_pil_image 8 X2 f: F2 }, C) \) q" qfrom PIL import Image7 L, f# |4 q% Y
import torch 8 }9 r& u& u) G% s) Eimport time3 ~5 _, d9 Y/ h: K% v2 b
$ _! K$ q6 P e( s+ Y k" N6 Z8 {0 u- y& _6 q1 B+ Y
def mean_square_loss(a_ts, b_ts):6 X8 e E! s/ ?9 T- D$ T O8 T
# print(a_ts.shape)- Y6 s& F9 W4 P6 x- I6 z7 i3 u
# print(b_ts)0 `0 M% j1 G. U0 b& r
sl = (a_ts - b_ts) ** 2/ E: T1 ?* k; X* f8 b* {
return sl.sum() ; P3 M7 L( f# w! C" c% i, D5 u0 ]9 [( a
- b' v. E, i z+ z4 a; j5 q' [
def change_red2blue(origin_png, result_png): 2 R+ f" n6 B+ o. D$ ^% N$ { src = Image.open(origin_png). [1 q. q+ X8 N1 L( c
src = to_tensor(src) c1 F+ F( _2 L2 X # print(src.shape) # torch.Size([3, 800, 600]) 2 ?! y- O! ^ C0 Z1 Q # channel: (R, G, B) / 255- j' L; v( q/ [2 H2 T$ P- j
h, w = src.shape[1], src.shape[2] ; Z5 p8 s6 Q+ S" c! S- {# m1 d7 X! b: M% `! W$ |* X6 y3 ~8 f' P9 [2 h1 ~7 g+ S
pha = torch.ones(h, w, 3) 3 U/ z5 s( b, Q5 z9 Y* `1 m4 G7 h/ m j
bg = torch.tensor([168,36,32]) / 255 $ x1 `5 f7 ?% [' h, a/ _ target_bg = torch.tensor([19,122,171]) / 2554 |( } r3 F; f
" `8 ]# y7 n2 s # C, H, W -> H, W, C2 R7 Z/ }* `; R; _0 o A
src = src.permute(1, 2, 0) 5 ]) `& i2 T+ M$ s1 P4 [6 H for i in range(h):1 f% T' i0 Z+ ^- N. ]( O, L
for j in range(w):6 F# c$ {. ^. X
if mean_square_loss(src[j], bg) < 0.025: # 0.025是阈值,超参数, C9 Z* t0 s9 K" d* q/ \, W
pha[j] = torch.tensor([0.0, 0.0, 0.0])1 w: p" g: b' O2 p* U
: L6 m% P- K( d; [+ `* H # H, W, C -> C, H, W $ _* z, ~" Z& T! P src = src.permute(2, 0, 1) ' B$ g7 C" h9 T: E1 s pha = pha.permute(2, 0, 1) 6 }$ ?. y2 b% I7 [$ D com = pha * src + (1 - pha) * target_bg.view(3, 1, 1) ) C9 q8 G, i" Z! T: P. y* W( x to_pil_image(com).save(result_png) . _2 d% @% e# \+ `( p \ |* c1 U 3 O9 m/ s! `% u* m0 Q/ _' v' ^: @/ K( j2 R5 q
if __name__ == '__main__': " o: ^) {+ B% p! O% I: ~, a( O origin_png = 'origin_png/person.jpg' + f- ^5 b& W. i+ m, _/ c result_png = 'result_png/com.png' l. j" ?0 }8 q/ M
start_time = time.time()+ D+ ? ?! o7 `# T. o+ [3 S
change_red2blue(origin_png, result_png)6 p0 q% R% F# _% j. x6 ?
spend_time = round(time.time() - start_time, 2)0 U$ t g ^, N# q: }3 j
print('生成成功,共花了 {} 秒'.format(spend_time)) Y( H" X o# D4 u8 e
1 0 {9 E% o& b1 h, }& e# y2 3 P& D) M, f |6 y+ }8 R3% J2 J$ m2 y* u( W/ A' M2 Y# \
4' a8 E2 U" G0 F9 V7 I
5 3 s/ w/ \3 [& h' V6 5 \4 ^0 ~4 {* J7 8 u6 ^2 V4 l6 A# ^& r8 ! x2 B( u2 \: g/ }7 m# b! U& P- v# `9 8 R2 V6 \$ j% z5 e5 q102 z/ Y% H# ]7 p% L8 B
11 ' G, x2 |& c+ C, ]& d12 1 ~* A3 [1 ^7 u9 g13! y# b z4 z# |6 A$ |
14/ T$ ^" A3 V) @. p& X
15" }0 R- o8 `) c
16( G5 }; A. E" ^' z' F
17 4 ^8 X/ K8 o+ ?) z& [7 Q18 * w7 U, i4 A( M: I5 U7 T19 & k, B. s2 D6 `6 Z* E20 * Y! h6 a# H" o$ y" a* U. b; m21 ( {! u0 z' ~0 H4 O4 u7 M! O220 B6 k/ ?9 F7 v2 S
23 9 w+ z0 |$ d, R: s/ N24. U6 _9 H b' x4 f) V2 ?
25 # F( r: z9 q* d26 7 ~* a+ t9 L$ b2 m) p/ |27% v2 W/ D% a0 d9 Q
28 6 ~4 X5 U) a$ P2 h8 ~! p% b$ D29 / h+ X, Y, k. I0 x30 }' _- k7 K' g' Q$ ?& f+ O% E
31' S: j' C8 Z8 g- X9 E) G6 [4 l. D9 A" _
32 ) l: g+ c6 u1 u4 u: [+ O+ A0 e33# _# E5 t. J* z8 D9 n5 x2 k& W
34 q# }+ y& P* y' ?1 X5 D0 P1 v
35 4 k1 V0 v1 z# q l36 8 {& {+ h: t+ r2 a6 c37 & `& [. E% v+ u4 w6 D38 + ~' ]; i( R6 U$ b39 ' r& M2 T5 e2 M- ^- \" g% N40 & C4 i4 j" @2 A) k/ c8 @# f$ O418 p* C$ D4 K3 F3 l
42 - i4 }4 F3 Q2 {- n43/ V9 G: X% k2 q" |, ]6 Q5 J. B
44 : W- k" S6 x8 U" V; t) [7 H6 O45 ( ]0 q/ u( P: N+ j) B- q! q464 ?/ a# f4 b% A' k, u) F
该方法质量较好,但一张图片大概需要12秒。* N5 n( I$ u, n3 J+ P: x8 p @+ C
h/ N) M: C6 D9 E7 E9 A2 J0 S
* |6 F' w# }1 T% N