" f4 O4 Q6 a! l/ U5 xh, w = img.shape[0], img.shape[1] 4 O6 G# t- {: j, g9 b! x7 Sprint('图片宽度: {}, 高度: {}'.format(h, w)) - o3 d" g& E4 f. H* `2 y+ w* \ ) i) R {% m% i/ a. `rgb = (19,122,171), s! [" f! b. e9 a6 t! ]
bgr = (rgb[2], rgb[1], rgb[0]) S/ _7 b% A8 ^2 O) w6 n" v6 m; n# (B, G, R) Z/ d2 K0 Q9 q' M' o l0 ?for i in range(h):. W/ C+ s6 I- n! ]2 W; C+ V o
for j in range(w):8 x) E- @9 S; K/ `
if (maskImg[i, j] == 0).all():: P0 p! b4 k2 [" W4 a
img[i, j] = bgr : S% K4 c% `) A; H$ bcv2.imwrite(result_png, img)" X% @% w0 h# H8 J4 q9 Z& h
print('图片写入 {} 成功'.format(result_png)) 1 }( ?0 J9 X" h3 {1 9 j5 [( a% h9 W23 Y$ a# B8 H. w5 ] i
3 : z$ S. y; p' x$ D4 E* f4 . |: E7 n" `2 A& a2 _2 l50 Y/ Q: l* }/ R+ a' Q. _
6# @& w0 W+ {0 [$ v; C5 X
7 8 F! y+ P& K4 B- b* x% f) l8 ' }. I1 t& _' X1 S9 & J* D" h# M0 W K$ m$ J10" u8 I& t6 N/ T
11& |& D* D1 N2 z+ h: H1 J: y5 D' p
125 l# R2 l; F! N$ f" l
13" A6 J) e. B A( F! j6 M- Z F
14 2 K1 G: d! f( D5 C9 B2 H15 0 P0 U2 H1 Y6 T+ I/ I: `* Y6 A& ?16 / G4 y3 N/ D b17 & Y! d% q! c/ G- `( x: L18 ( r+ p v7 ]. ^2 O- ?- T198 `5 H6 r! l" |$ M. R
20 , c. Y" d5 r4 W) s8 [3 ~' V21 , s$ W" I5 Z2 @8 I0 S7 D22 c# X8 W& Z! {$ _# T& K
236 [4 M+ P4 D+ z3 e* f
24 3 s9 w: b# v, R& T4 O# A- ]25( F9 }9 [1 U" {3 e0 N: v
26 0 {* O2 G( v$ \* `/ k, J27 2 l E4 J9 Q/ R; f% E! X3 V* F由于人长得一般,就不放图了… 4 Y; M' Q3 g- `5 [1 ~! P p$ ~9 c1 E& `
缺点:4 X) R0 d+ q7 J' B7 H
lableme标注时挺费力,并且难以避免人与背景边缘会有残留红色像素的情况。5 @/ H6 r, g1 g& ]; y
$ N: T6 B' b7 p! T ; ?* V% ^( q0 ?$ y0 \+ W/ m( I5 j. H! n; x# i
" x( J4 B/ t' F, `$ w2 e
# _6 X+ b; ?/ I9 x
方法二: 阈值3 ?- v; X6 ~" S, ]
该方法通过比较像素的RGB与背景的RGB来区分是否为图像背景。, ~9 |; _1 u. p+ E. o7 z6 Q
! k6 a9 y# @% N* [5 s
Opencv7 n2 x: h* \; F' R
import cv2 7 ?. t3 H+ f# v4 z4 pimport numpy as np 8 d1 L# O6 N; j7 l' ^% P! v( A# K! _: }* {( V8 C5 }6 B
2 S+ g2 \) B# `: J4 O5 o- X
def mean_square_loss(a_np, b_np):' }- ?) O+ }) C: \1 ^) }
sl = np.square(a_np - b_np) h# U, V8 Z3 [" A e
return np.mean(sl)$ j7 T- g& ~7 q1 I0 A3 [
4 X5 H2 K" N, ]
- c6 v. g; o$ M" Fdef change_red2blue(origin_png, result_png): % `5 _- i; p4 v; X img = cv2.imread(origin_png) ) E6 e7 g" [. X0 x) W+ X( Q( G6 P9 J, b" ?+ a$ Y2 Y( P W# C
h, w = img.shape[0], img.shape[1] / M! E- @( h! B- A2 v+ j/ n print('图片宽度: {}, 高度: {}'.format(h, w)) 8 h) y8 G) j: B( }) y. b( E1 W) _: g& [# w. W/ c1 m
origin_rgb = (168,36,32) # 可以用浏览器啥的控制台工具提取出背景的rgb值 5 d! D* r4 L( c5 _: Z" ~# R origin_bgr = (origin_rgb[2], origin_rgb[1], origin_rgb[0])8 m2 N; {) h$ m0 W. g9 w
target_rgb = (19,122,171) # 蓝底RBG( {: v8 Q) {4 J' E M1 u9 Q
target_bgr = (target_rgb[2], target_rgb[1], target_rgb[0])" E& B. I0 S* k) u/ p
0 h* q1 i) G9 \' d: h$ L" D' P4 v' t! X for i in range(h): 4 s( h/ h) o: E- I0 F( |9 G for j in range(w):" ?. a+ a) ^9 }& J9 j
# (B, G, R) 4 R( j0 {# K {5 ?& l2 e if mean_square_loss(img[i, j], origin_bgr) < 50:9 G) Q/ H, ^. X- u" h
img[i, j] = target_bgr ( t# G' [# y( `) l& `1 a, H
; s' m/ c1 l: e- O* @+ i
cv2.imwrite(result_png, img) ; E, p |5 i4 E2 F1 h6 @( L" k print('图片写入 {} 成功'.format(result_png))5 w: r6 E2 }6 K0 _
- E, X3 Z* ^+ W' |( \$ z
- f7 I5 _9 Y L- d+ D: |if __name__ == '__main__': { L' o3 k: d" f1 t # origin_png = 'result_png/result_png.png' & ?) ~6 }$ p7 z% ^7 O. G: y2 i origin_png = 'origin_png/person.jpg'. B3 Z7 q# j- v/ d. h2 }: \& G
result_png = 'result_png/result_refine.png'1 c) t' h4 n v1 [% U8 j
change_red2blue(origin_png, result_png) , H+ D9 q" x0 q# O) |1 $ `0 Q4 U, m3 q$ r2 ; g% F( g9 s8 }* m! r" A3 - L/ n: y* }1 ~- k9 ]8 |7 X4& m9 p# n7 V& y2 H/ q N
5 ! R! W$ O% o( F$ e" R! m6+ @* m* P8 P F3 L, G
73 B% j( U$ `0 t1 k( p+ |
8 8 n# ~4 z1 V) h* C0 u9 5 g5 }5 L }$ |1 m10 9 u5 w+ T F# y f3 J112 Q# b" @8 C* o" v4 J
122 z0 `- a1 T+ }% C9 E
13 % u( j+ }- C: |* l- T# ^: m8 E6 T' y14 ! c* o0 F3 n5 Q+ Y. d, X G15% e- s$ W, ^0 W. R! H, N0 Q
16 + f& S6 u' z* b176 Z6 ~0 m# n# I L. b# g3 U
18" ~; _+ O( K+ L- e9 D
19 ( @6 j" X, b' x' `% `20 , A. ?" _) z# D" B21 # U: |9 m; b; _( N. M22: D# x# L2 H/ [( @
23 ( F' a1 z# Z1 u24- _8 H& `' { b+ m* E3 V
25 : S' B# H/ N2 j p7 b) ~26 % A- n- j3 M( b27 3 X6 ^& L5 Y- ~28& W+ P) |9 O, K) E# U, `
29# W% Z6 N7 M; H2 O/ {. Z
30% s5 s) b6 C# }
31( R' y8 P" H% k; \
32; ^3 c( r* y4 g
338 C9 s* v5 w. v7 W1 a" O9 q3 z
34 " k6 {/ i4 h* O/ ~35# U$ q+ {9 \4 x' r. c
结果人与背景边缘仍会存在红色像素残留 S& [, s% V! v8 O: q1 O$ f
0 q, n5 y5 `8 F: l0 S
% a0 W8 f$ S" O' Y
$ {& b7 V2 I( r; F& s/ M+ E3 a: v1 y( s8 `2 [* w
; a1 |. [' y7 o' X, ~' e, iPIL3 }2 Z6 W& z4 D
from torchvision.transforms.functional import to_tensor, to_pil_image/ ~ }! j6 E" b3 p I
from PIL import Image" v1 \' V! i o/ Y0 O
import torch4 u& P- U' g/ ^2 f
import time+ p4 f# s* a2 h1 ]: I
0 I. ]6 V& Z! |" u* @: P