2-5.Segmentación por color

Buenas de nuevo, ya estamos de vuelta al trabajo.

Se nos hace dura la vuelta y vamos a hacerla más fácil con un ejercicio sencillo.

Segmentar por color.

11

En este caso es simple, buscamos solo la parte de la imagen que contiene el negro

¿Cómo seleccionamos un color?

Los colores como ya hemos visto, se definen por un un Scalar(R,G,B), tenemos la función  inRange(imgOriginal, min, max, imgDestino)

Hagamos un programa sencillo

1º Abrir una imagen

2º Mostrar la imagen

3º Filtrar la imagen

void inRange(InputArray src, InputArray lowerb, InputArray upperb, OutputArray dst)

4º Mostrar el resultado y grabar la imagen.

 

Hagamos el programa.
Luego lo cuelgo ;)


#include <iostream>
#include "opencv2/opencv.hpp"


using namespace cv;
using namespace std;

//
//
//DECLARACION DE LAS FUNCIONES
//
//

//Función que controla los valores de la barra.
static void on_track (int, void*);

//variables globales
//
Mat img(1,1,CV_8UC3); //reservamos un espacio para una imagen de un pixel y 3 canales de 8 bits (255,255,255)
int valorBMin=0;
int valorGMin=0;
int valorRMin=0;
int valorBMax=255;
int valorGMax=255;
int valorRMax=255;


#define VENTANA_PIXEL_MIN "MIN PIXEL"
#define VENTANA_PIXEL_MAX "MAX PIXEL"
//
//
//PROGRAMA PRINCIPAL
//
//
Mat imgOriginal;
int main (int argc, char **argv)
{
namedWindow(VENTANA_PIXEL_MIN, CV_WINDOW_NORMAL | CV_WINDOW_FREERATIO | CV_GUI_EXPANDED);
namedWindow(VENTANA_PIXEL_MAX, CV_WINDOW_NORMAL | CV_WINDOW_FREERATIO | CV_GUI_EXPANDED);
imgOriginal = imread(argv[1],CV_LOAD_IMAGE_UNCHANGED);
createTrackbar("B_min",VENTANA_PIXEL_MIN, &valorBMin,255,on_track);
createTrackbar("G_min",VENTANA_PIXEL_MIN, &valorGMin,255,on_track);
createTrackbar("R_min",VENTANA_PIXEL_MIN, &valorRMin,255,on_track);
createTrackbar("B_max",VENTANA_PIXEL_MAX, &valorBMax,255,on_track);
createTrackbar("G_max",VENTANA_PIXEL_MAX, &valorGMax,255,on_track);
createTrackbar("R_max",VENTANA_PIXEL_MAX, &valorRMax,255,on_track);
on_track(0,0); //los parametros son pasados por referencia
imshow("Original",imgOriginal);

waitKey(0);
}

static void on_track(int valor, void*)
{

img = Scalar(valorBMin, valorGMin, valorRMin);
imshow(VENTANA_PIXEL_MIN,img);
img = Scalar(valorBMax, valorGMax, valorRMax);
imshow(VENTANA_PIXEL_MAX,img);
Mat imgFiltrada;
Mat imgInversa;
inRange(imgOriginal,Scalar(valorRMin,valorGMin,valorBMin), Scalar(valorRMax,valorGMax,valorBMax), imgFiltrada);
imshow("Filtrada",imgFiltrada);
inRange(imgOriginal,Scalar(valorRMax,valorGMax,valorBMax), Scalar(valorRMin,valorGMin,valorBMin), imgInversa);
imshow("Filtrada_inversa",imgFiltrada);
}