Module 6.1
Blemish Removal
Table of Contents
Overview
Blemish Removal
Spatial Domain Analysis
Frequency Domain Analysis
Code and Tutorial - Blemish Removal
References and Further Reading
En este modulo, tratamos de
remover imperfecciones de la piel en un proceso de dos etapas:
1.- Encontrar un parche de
imagen para reemplazar la región imperfecta. Los parches con mayor potencial están
en el vecindario de la imperfección porque la iluminación y la textura en esta región
es más probable que sean consistentes con la región de la imperfección.
2.- Aplicar “Seamless Cloning”
para mezclar el parche sobre la región imperfecta.
Para hacer un análisis en el
dominio espacial usamos Sobel, cuanta más rudeza, mas contraste en la imagen
del gradiente y también el valor medio de los gradientes es mayor.
Para hacer un análisis en el
dominio de la frecuencia, usamos la transformada de Fourier para analizar el
contenido de frecuencias en la imagen.
Module 6.2
Skin Detection
Table of Contents
Overview
Distribution of skin pixels in various color spaces
Observations
Rule based Skin Detection
The rules
Code and Tutorial for Rule based skin detection
Threshold based Skin detection
Step 1 : Extract a patch for reference
Step 2 : Extract all pixels similar to the reference color
Step 3 : Apply mask to remove non-skin parts
Code and Tutorial - Threshold based skin detection
References and Further Reading
En este modulo, se aprende sobre
la detección de la piel en imágenes y videos. Esto tiene muchas aplicaciones.
Las dificultades vienen de que:
.- Las caracteristicas de color se
ven afectadas por las diferentes condiciones de iluminación y el mismo color
puede aparecer diferente.
.- Ingente variación entre el
color de la piel
.- Fondos de imagen que parecen
piel humana
Se muestran gráficos que
representan la frecuencia de combinaciones de canales de color para pixeles de
piel y no piel, de lo cual se observa:
.- Los espacios de color YCrCb y
Lab nos dan una representación más compacta de los pixeles de la piel que el
espacio de color BGR.
.- En todos los espacios de
color, hay solapamiento entre las regiones de piel y no-piel, lo que hace
irresoluble el problema considerando exclusivamente las características de
color.
.- El espacio de color HSV es
favorecido, si solo se considera el parámetro
de color del canal H que tiene información acerca del color verdadero del
pixel.
Hay un sistema basado en reglas
obtenidas de diferentes estudios que dan muy buenos resultados, aunque también
muchos falsos positivos.
Las reglas:
Un pixel (R,G,B) es clasificado
como “piel” si se cumplen todas las reglas siguientes:
1. R > 95
2. G > 40
3. B > 20
4. R > G
5. R > B
6. | R - G | > 15
7. max{ R, G, B } -
min{ R, G, B } > 15
Para mejorar el método anterior
de las “reglas”, derivaremos el rango de valores creando una máscara a partir
de la imagen misma, extrayendo la cara.
Paso 1: Extraer un parche para
referencia. Usamos Dlib y podemos extraer una pequeña región de la cara, de la
cual estamos completamente seguros que es una región de piel pura. A partir de
este parche, encontramos la media de los pixeles de esa región y lo mantenemos
como el color de referencia.
Paso 2: Extraemos todos los
pixeles similares al color de referencia. Después aplicamos “opening” para
llenar los huecos del resultado inicial.
Paso 3: Aplicar una máscara para
remover las partes que no sean piel. Desde que tenemos los puntos Dlib, podemos
remover las partes como ojos, boca, cejas de la región de piel detectada.
Module 6.3
Skin Detection
Gaussian Bayes Classifier
Table of Contents
Overview
Bayes Classification
What is Bayes Theorem?
Skin Detection using Gaussian Bayes Classifier
Gaussian Bayes Classifier
How to fit a Gaussian to multidimensional data?
Training
Prediction
Code and Tutorial for Skin Detection using
NormalBayesClassifier
References and Further Reading
En este modulo, se presenta el
Clasificador de Bayes Gaussiano como clasificador binario de pixeles de piel.
La regla de Bayes para
probabilidad condicional es: P(Y|X)=P(X|Y)* P(Y)/P(X)
OpenCV tiene las funciones que
hacen esto a partir de una base de datos de entrenamiento etiquetadas:
C++
Ptr<TrainData> trainData
= TrainData::create(X, ROW_SAMPLE, Mat(Y));
Ptr<NormalBayesClassifier>
nbc =
StatModel::train<NormalBayesClassifier>(trainData);
Module 6.4
Facial Skin Detection &
Smoothing Using Grabcut
Table of Contents
Ninjas versus Samurais
What is GrabCut?
Step 1: Draw a rectangle
Step 2: Hinting
GrabCut in OpenCV
Skin Detection and Smoothing using GrabCut :
Code & Tutorial
References
and Further Reading
En este modulo, se explica el método
de segmentación interactiva. Es usado para separar una imagen en frente y
fondo. Para usarlo, empezamos delimitando una zona rectangular que contiene el
elemento del frente y la función hace una segmentación aproximada. A partir de
aquí vamos refinando la segmentación en iteraciones sucesivas, indicándole a la función que determinados
pixeles son:
1.- definitivamente frente
2.- definitivamente fondo
3.- probablemente frente
4.- probablemente fondo.
GrabCut esta implementado en
OpenCV usando una función llamada grabCut.
C++ grabCut (Mat& img, Mat &mask,
Rect rect, Mat& bgdModel, Mat& fgdModel,
int
iterCount, int mode=GC_EVAL)
mask = mascara
conteniendo cuatro valores posibles.
1. Definitely background (
GC_BGD )
2. Definitely foreground (
GC_FGD )
3. Probably background (
GC_PR_BGD )
4.
Probably foreground ( GC_PR_FGD )
mode =
Este parámetro
controla el modo de inicializacion.
1. Use GC_INIT_WITH_RECT to
initialize with a rectangle
2. Use GC_INIT_WITH_MASK to
initialize with mask.
3. Use GC_INIT_WITH_RECT |
GC_INIT_WITH_MASK to use both.
4. GC_EVAL to just resume.
This is used for successive iterations in an
interactive setup.
Module 6.5
Grabcut Theory
Table of Contents
GrabCut Theory
Color Models for Background and Foreground
What is a Gaussian Mixture Model?
How are GMM parameters calculated in GrabCut?
Segmentation as Energy Minimization
Mincut for Energy Minimization
References
and Further Reading
En este modulo, se trata de la
teoria de “GrabCut”
Tenemos como entrada:
a.- Una imagen de entrada
b.- Una caja o rectángulo
envolvente alrededor del objeto de interés. Los pixeles fuera de la caja son
definitivamente “fondo”. Los puntos dentro de la caja pueden ser fondo o
frente, pero se supone que la mayoría de ellos son frente. Por ello es deseable
usar un rectángulo envolvente muy ajustado.
c.- Pistas: Cuales pixeles son
“fondo”, “frente”, “probablemente fondo” y “probablemente frente”.
Una salida
a.- Una máscara alpha que es 1
(o 255) en los pixeles del frente y 0 en los pixeles del fondo.
El primer paso en GrabCut es
construir un “modelo de color” para el “fondo” y para el “frente”. Estos
modelos de color son actualizados cuando la máscara cambia.
Un “modelo de color” es una función
que toma un valor RGB y devuelve una probabilidad, (un numero entre 0 y 1) de
que el color pertenezca a ese “modelo de color”.
Así, tendremos un modelo de
color para el frente (F) y un modelo de color para el fondo (B), si queremos
evaluar un pixel c, tendremos:
Probabilidad de que el pixel
este en el frente =F(c);
Probabilidad de que el pixel
este en el fondo =B(c);
Si F(c) > B(c), el pixel
pertenece al frente.
En la realidad, si un pixel
pertenece al frente o al fondo depende de su color y además de su localización
y de sus vecinos.
En GrabCut, los modelos de color
de frente y fondo son modelados usando Modelos de Mezcla de Gaussianos (GMM).
Un modelo de mezcla de
Gaussianos, permite aproximar un histograma de una imagen con la suma ponderada
de varias distribuciones de Gauss con diferente media y desviación típica. En
GrabCut se usa K=5, es decir 5 funciones de Gauss diferentes.
En OpenCV se usa un algoritmo
llamado K-Means para encontrar esos parámetros.
GrabCut es planteado como un
problema de minimización de energía. Hay dos términos en la función de costo de
GrabCut.
1.- Data term: Los
valores de la salida alpha, deberían ser asignados así que los pixeles que son
etiquetados como frente tienen colores que son mejor explicados por la GMM del
frente que la GMM del fondo.
2.- Smoothness term: La asignación
de los valores de salida alpha deberían también tomar en consideración el hecho de que si los vecinos de un pixel
son predominantemente de una etiqueta en particular (frente o fondo), al pixel
le debería ser asignada la misma etiqueta con mayor probabilidad. Dicho de otra
forma, la máscara alpha debería ser suave con grandes regiones de frente o
fondo. Este término asegura que no veremos pequeños huecos en nuestra segmentación
final.
Mincut para minimización de energía
No hay comentarios:
Publicar un comentario