3 :
,
, , . , , , Google, , , Shirt TShirt .
:
- grabcut .
- ( - ). , - , .
- HSV
- H S ( )
- hsv . , , ( HSV) - , .
- ( :))
- , . , , , , - . - , , . - , - sleevs.
( - , ( ), , hsv, , ):




, , 3, (, , - - , ;)).
, , - :
import cv2
import numpy as np
def process_image(img, face_pos, title):
if len(face_pos) == 0:
print 'No face found!'
return
mask = np.zeros((img.shape[0], img.shape[1]), dtype=np.uint8)
cv2.grabCut(img, mask, tuple(face_pos[0]), np.zeros((1,65), dtype=np.float64), np.zeros((1,65), dtype=np.float64), 1, cv2.GC_INIT_WITH_RECT)
mask = np.where((mask==1) + (mask==3), 255, 0).astype('uint8')
img_masked = cv2.bitwise_and(img, img, mask=mask)
cv2.imshow(title, mask)
cv2.imshow(title+' masked', img_masked)
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
channels = [0,1]
channels_ranges = [180, 256]
channels_values = [0, 180, 0, 256]
histogram = cv2.calcHist([img_hsv], channels, mask, channels_ranges, channels_values)
histogram = cv2.normalize(histogram, None, 0, 255, cv2.NORM_MINMAX)
dst = cv2.calcBackProject([img_hsv], channels, histogram, channels_values, 1)
cv2.imshow(title + ' calcBackProject raw result', dst)
ret, thresholded = cv2.threshold(dst, 25, 255, cv2.THRESH_BINARY)
cv2.imshow(title + ' thresholded', thresholded)
cv2.waitKey(5000)
row1 = np.hstack((img, cv2.cvtColor(mask, cv2.COLOR_GRAY2BGR), img_masked))
row2 = np.hstack((img_hsv, cv2.cvtColor(dst, cv2.COLOR_GRAY2BGR), cv2.cvtColor(thresholded, cv2.COLOR_GRAY2BGR)))
return np.vstack((row1, row2))
paths = ['1.jpg', '2.jpg', '3.jpg', '4.jpg']
haar_cascade = cv2.CascadeClassifier('C:\\DevTools\\src\\opencv\\data\\haarcascades\\haarcascade_frontalface_default.xml')
for path in paths:
img = cv2.imread(path)
face_pos = haar_cascade.detectMultiScale(img, 1.3, 5, cv2.CASCADE_FIND_BIGGEST_OBJECT)
if len(face_pos) == 0:
face_pos = haar_cascade.detectMultiScale(img, 1.1, 3, cv2.CASCADE_FIND_BIGGEST_OBJECT)
result = process_image(img, face_pos, path)
cv2.imwrite('result_' + path, result)
(, , - ?)
() . , , . . (, , ) , :
- set rect ( )
sure foreground - sure foregroung "color"sure backgroundsure background (, " " )
sure foreground possible foreground , ( backgrund). - .
, .
. , SHIRT , - . :
. - .
, . 2 , :
- HSV (2 - , ) Hue . 2 . () .
- , , . , .
, , , . , .
//:
. ... , - , , ;) , .
( + Google) . :
import cv2
import numpy as np
from collections import OrderedDict
import operator
def shirt_fft(img, face_pos, title):
shirt_rect_pos = face_pos[0]
shirt_rect_pos[1] += 2*shirt_rect_pos[3]
shirt_sample = img[shirt_rect_pos[1]:shirt_rect_pos[1]+shirt_rect_pos[3], shirt_rect_pos[0]:shirt_rect_pos[0]+shirt_rect_pos[2]].copy()
shirt_sample = cv2.resize(shirt_sample, dsize=(256, 256))
shirt_sample_gray = cv2.cvtColor(shirt_sample, cv2.COLOR_BGR2GRAY)
f = np.fft.fft2(shirt_sample_gray)
fshift = np.fft.fftshift(f)
magnitude_spectrum = 20*np.log(np.abs(fshift))
print magnitude_spectrum.max(), magnitude_spectrum.min(), magnitude_spectrum.mean(), magnitude_spectrum.dtype
magnitude_spectrum = cv2.normalize(magnitude_spectrum, alpha=255.0, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8UC1)
print magnitude_spectrum.max(), magnitude_spectrum.min(), magnitude_spectrum.mean(), magnitude_spectrum.dtype
magnitude_spectrum_original = magnitude_spectrum.copy()
temp, magnitude_spectrum = cv2.threshold(magnitude_spectrum, 200, 255.0, cv2.THRESH_TOZERO)
return shirt_sample_gray, magnitude_spectrum_original, magnitude_spectrum
paths = ['1.jpg', '2.jpg', '3.jpg', '4.jpg', 'plain1.jpg', 'plain2.jpg', 'plain3.jpg', 'plain4.jpg', 'stripes1.jpg', 'stripes2.jpg']
haar_cascade = cv2.CascadeClassifier('C:\\DevTools\\src\\opencv\\data\\haarcascades\\haarcascade_frontalface_default.xml')
fft_dict = OrderedDict()
results_img = None
for path in paths:
img = cv2.imread(path)
face_pos = haar_cascade.detectMultiScale(img, 1.3, 5, cv2.CASCADE_FIND_BIGGEST_OBJECT)
if len(face_pos) == 0:
face_pos = haar_cascade.detectMultiScale(img, 1.1, 3, cv2.CASCADE_FIND_BIGGEST_OBJECT)
results = shirt_fft(img, face_pos, path)
if results_img is None:
results_img = np.hstack(results)
else:
results_img = np.vstack((results_img, np.hstack(results)))
fft_dict[path] = results[2]
similarity_dict = {}
cv2.imshow('results_img', results_img)
cv2.waitKey(1)
for i in range(len(fft_dict.keys())):
for j in range(i+1, len(fft_dict.keys())):
key1, key2 = fft_dict.keys()[i], fft_dict.keys()[j]
print 'pair: ', key1, key2
img1 = fft_dict[key1]
img2 = fft_dict[key2].copy()
correlation = cv2.matchTemplate(img1, img2, cv2.TM_CCORR_NORMED)
print correlation.shape, correlation.dtype, correlation.max()
similarity_dict[key1 + ' - ' + key2] = correlation.max()
sorted_similarity_dict = sorted(similarity_dict.items(), key=operator.itemgetter(1), reverse=True)
print "final result: "
for a in sorted_similarity_dict:
print a
cv2.waitKey(50000)
- , , .
- :
- ( 2 * )
- (256, 256).
- fft
- fft-
- ( 0 255)
- ( < 200) - ..
- . → . :
('plain1.jpg - plain3.jpg', 1.0)
('plain3.jpg - plain4.jpg', 1.0)
('plain1.jpg - plain4.jpg', 1.0)
('stripes1.jpg - stripes2.jpg', 0.54650664)
('1.jpg - 3.jpg', 0.52512592)
('plain1.jpg - stripes1.jpg', 0.45395589)
('plain3.jpg - stripes1.jpg', 0.45395589)
('plain4.jpg - stripes1.jpg', 0.45395589)
('plain1.jpg - plain2.jpg', 0.39764369)
('plain2.jpg - plain4.jpg', 0.39764369)
('plain2.jpg - plain3.jpg', 0.39764369)
('2.jpg - stripes1.jpg', 0.36927304)
('2.jpg - plain3.jpg', 0.35678366)
('2.jpg - plain4.jpg', 0.35678366)
('2.jpg - plain1.jpg', 0.35678366)
('1.jpg - plain1.jpg', 0.28958824)
('1.jpg - plain3.jpg', 0.28958824)
('1.jpg - plain4.jpg', 0.28958824)
('2.jpg - 3.jpg', 0.27775836)
('4.jpg - plain3.jpg', 0.2560707)
('4.jpg - plain1.jpg', 0.2560707)
('4.jpg - plain4.jpg', 0.2560707)
('3.jpg - stripes1.jpg', 0.25498456)
('4.jpg - plain2.jpg', 0.24522379)
('1.jpg - 2.jpg', 0.2445447)
('plain4.jpg - stripes2.jpg', 0.24032137)
('plain3.jpg - stripes2.jpg', 0.24032137)
('plain1.jpg - stripes2.jpg', 0.24032137)
('3.jpg - stripes2.jpg', 0.23217434)
('plain2.jpg - stripes2.jpg', 0.22518013)
('2.jpg - stripes2.jpg', 0.19549081)
('plain2.jpg - stripes1.jpg', 0.1805127)
('3.jpg - plain4.jpg', 0.14908621)
('3.jpg - plain1.jpg', 0.14908621)
('3.jpg - plain3.jpg', 0.14908621)
('4.jpg - stripes2.jpg', 0.14738286)
('2.jpg - plain2.jpg', 0.14187276)
('3.jpg - 4.jpg', 0.13638313)
('1.jpg - stripes1.jpg', 0.13146029)
('4.jpg - stripes1.jpg', 0.11624481)
('1.jpg - plain2.jpg', 0.11515292)
('2.jpg - 4.jpg', 0.091361843)
('1.jpg - 4.jpg', 0.074155055)
('1.jpg - stripes2.jpg', 0.069594234)
('3.jpg - plain2.jpg', 0.059283193)
, ( ) :

( , ): ['1.jpg', '2.jpg', '3.jpg', '4.jpg', 'plain1.jpg', 'plain2.jpg', 'plain3.jpg', 'plain4.jpg', 'stripes1.jpg', 'stripes2.jpg']
, . , , ( ).
edit2:
- , , . Haar LBP ( ).