Fix skin filter.

* Remove Y from GS threshold.
* Not really fixed, just looks slightly better.
This commit is contained in:
iabdalkader 2016-02-28 04:10:56 +02:00
parent 955856488c
commit 8b3b7e6ece

View File

@ -39,18 +39,19 @@ void im_filter_bw(uint8_t *src, uint8_t *dst, int size, int bpp, void *args)
} }
// Thresholds taken from "Skin Segmentation Using YUV and RGB Color Spaces" Zaher Hamid Al-Tairi
void im_filter_skin(uint8_t *src, uint8_t *dst, int size, int bpp, void *args) void im_filter_skin(uint8_t *src, uint8_t *dst, int size, int bpp, void *args)
{ {
if (bpp == 1) { if (bpp == 1) {
// Kinda works // Kinda works
for (int i=0; i<size; i+=2, src+=4) { for (int i=0; i<size; i+=2, src+=4) {
uint8_t y0 = src[0]; //uint8_t y0 = src[0];
uint8_t u = src[1]; uint8_t u = src[1];
uint8_t y1 = src[2]; //uint8_t y1 = src[2];
uint8_t v = src[3]; uint8_t v = src[3];
// YCbCr // YCbCr
dst[i+0] = (y0>80 && u>85 && u<135 && v>135 && v<180) ? 255 : 0; dst[i+0] = (u>80 && u<130 && v>136 && v<200 && v>u) ? 255 : 0;
dst[i+1] = (y1>80 && u>85 && u<135 && v>135 && v<180) ? 255 : 0; dst[i+1] = (u>80 && u<130 && v>136 && v<200 && v>u) ? 255 : 0;
} }
} else { } else {
@ -64,11 +65,8 @@ void im_filter_skin(uint8_t *src, uint8_t *dst, int size, int bpp, void *args)
//int y = yuv_table[srcrgb[i] * 3 + 0] + 128; //int y = yuv_table[srcrgb[i] * 3 + 0] + 128;
int u = (int) yuv_table[srcrgb[i] * 3 + 1] + 128; int u = (int) yuv_table[srcrgb[i] * 3 + 1] + 128;
int v = (int) yuv_table[srcrgb[i] * 3 + 2] + 128; int v = (int) yuv_table[srcrgb[i] * 3 + 2] + 128;
// From "Skin Segmentation Using YUV and RGB Color Spaces" Zaher Hamid Al-Tairi dstrgb[i] = (u>80 && u<130 && v>136 && v<200 &&
dstrgb[i] = (u>80 && u<130 && r>80 && g>30 && b>15 && (((r-g)*(r-g)) > 225)) ? srcrgb[i] : 0;
v>136 && v<200 && v>u &&
r>80 && g>30 && b>15 &&
(((r-g)*(r-g)) > 225)) ? srcrgb[i] : 0;
} }
} }
} }