Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

Create a structuring element of 3 * 3

Greetings.

I'm working Qt and OpenCV. I am currently testing the functions of mathematical morphology.

I'm trying to create a rectangular structuring element of 3 * 3, using the cvCreateStructuringElementEx() function, as follows:

cvCreateStructuringElementEx ee = (3, 3, 1, 1, CV_SHAPE_RECT)

This should create the structuring element I seek not?

Then apply the dilation operation to two previously created images. In the second image using 'ee' and first put so as NULL use default structuring element. so:

cvDilate (entrada_gris, dilatacion1, NULL, iteraciones); cvDilate (entrada_gris, dilatacion2, ee, iteraciones);

Variable 'iteraciones' is the number of iterations that the operation is applied, usually I use 10.

Since the default structuring element is a solid rectangle 3 * 3 (and if I'm creating the structuring element 'ee' correctly), the result should be the same, but it is not because when a comparison between the images:

cvCmp (dilatacion1, dilatacion2, comparison, CV_CMP_EQ);

I get an image that is not completely white (as it should be if the two images are the same right?).

If anyone has an idea of what may be happening or give me some light I would appreciate advance.

Attach program source code in case anyone wants to see.

#include "opencv.hpp"

int main(int argc, char **argv)
{
    IplImage *entrada, *entrada_gris;
    IplImage *dilatacion1, *dilatacion2, *comparacion;
    IplConvKernel *ee;
    unsigned iteraciones;

    /* cargar imagen de entrada */
    entrada = cvLoadImage( argv[1] );

    /* leer el numero de iteraciones */
    iteraciones = 0;
    for(unsigned i = 0; i < strlen(argv[2]); i++)
    {
        iteraciones = (iteraciones * 10) + (argv[2][i] - '0');
    }

    /* ******************************** */
    FILE *salida = fopen("salida.txt", "w");

    fprintf(salida, "iteraciones = %d\n", iteraciones);
    fclose( salida );
    /* ******************************** */

    /* convertir a escala de gris */
    entrada_gris = cvCreateImage(cvGetSize(entrada), IPL_DEPTH_8U, 1);
    cvCvtColor(entrada, entrada_gris, CV_BGR2GRAY);

    /* asignar la memoria para las imagenes imagenes */
    dilatacion1 = cvCreateImage(cvGetSize(entrada), IPL_DEPTH_8U, 1);
    dilatacion2 = cvCreateImage(cvGetSize(entrada), IPL_DEPTH_8U, 1);
    comparacion = cvCreateImage(cvGetSize(entrada), IPL_DEPTH_8U, 1);

    /* crear EE */
    ee = cvCreateStructuringElementEx(3, 3, 1, 1, CV_SHAPE_RECT);

    /* aplicar dilatacion */
    cvDilate(entrada_gris, dilatacion1, NULL, iteraciones);
    cvDilate(entrada_gris, dilatacion2, ee, iteraciones);

    cvCmp(dilatacion1, dilatacion2, comparacion, CV_CMP_EQ);

    /* crear las ventanas para mostrar las imagenes */
    cvNamedWindow("IMAGEN DE ENTRADA", CV_WINDOW_NORMAL);
    cvNamedWindow("IMAGEN DE ENTRADA - ESCALA DE GRIS", CV_WINDOW_NORMAL);
    cvNamedWindow("DILATACION (EE por defecto)", CV_WINDOW_NORMAL);
    cvNamedWindow("DILATACION (EE creado)", CV_WINDOW_NORMAL);
    cvNamedWindow("COMPARACION", CV_WINDOW_NORMAL);

    /* mostrar las imagenes en las ventanas apropiadas */
    cvShowImage("IMAGEN DE ENTRADA", entrada);
    cvShowImage("IMAGEN DE ENTRADA - ESCALA DE GRIS", entrada_gris);
    cvShowImage("DILATACION (EE por defecto)", dilatacion1);
    cvShowImage("DILATACION (EE creado)", dilatacion2);
    cvShowImage("COMPARACION", comparacion);

    /* esperar a que el usuario presione una tecla */
    cvWaitKey(0);

    /* liberar la memoria reservada */
    cvReleaseStructuringElement( &ee );

    cvReleaseImage( &entrada );
    cvReleaseImage( &entrada_gris );
    cvReleaseImage( &dilatacion1 );
    cvReleaseImage( &dilatacion2 );
    cvReleaseImage( &comparacion );

    cvDestroyWindow( "IMAGEN DE ENTRADA" );
    cvDestroyWindow( "IMAGEN DE ENTRADA - ESCALA DE GRIS" );
    cvDestroyWindow( "DILATACION (EE por defecto)" );
    cvDestroyWindow( "DILATACION (EE creado)" );
    cvDestroyWindow( "COMPARACION" );

    return 0;
}