Publicado el 21 de Abril del 2017
1.502 visualizaciones desde el 21 de Abril del 2017
524,2 KB
12 paginas
Creado hace 10a (24/03/2015)
Universidad Politécnica de Madrid
INFORMES:
ITK, MEX y OpenMP
Sandra Rodríguez Rodrigo
March 24, 2015
1
1 Índice
1 Índice
2 Introducción
3 ITK
3.1 Filtro binomial
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.2 Resultado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4 MEX
4.1 Filtro binomial
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.2 Resultado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2
3
3
3
5
6
6
8
5 OPENMP
5.1 Paralelización bwDistC . . . . . . . . . . . . . . . . . . . . . . . . . .
5.2 Resultado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.2.1 Primera comprobación . . . . . . . . . . . . . . . . . . . . . .
5.2.2
9
9
9
9
Segunda comprobación . . . . . . . . . . . . . . . . . . . . . . 10
6 ITKMEX
11
6.1 Filtro binomial
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
6.2 Resultado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2
2 Introducción
El objetivo de esta práctica es el estudio de las librerías ITK (Insight Segmenta-
tion and Registration Toolkit) así como de los interfaces MEX y OpenMp para el
tratamiento de imágenes.
3 ITK
3.1 Filtro binomial
Los filtros binomiales son estructuras eficientes basadas en los coeficientes binomiales
resultantes de la implementación de Gauss.
Este filtro usa la convolución gracias a la cual es posible simplificar las matemáticas
y ahorrar tiempo. También resulta muy útil para el procesamiento de imágenes en
algunos casos como para la detención de bordes.
Dado el siguiente código de Matlab:
1 f u n c t i o n imgSal = binomialMatlab ( imgEnt )
2 maskConv = [ 1 2 1 ; 2 4 2 ; 1 2 1 ] . / 1 6 ;
3 imgSal = i m f i l t e r ( imgEnt , maskConv , ’ r e p l i c a t e ’ ) ;
4 \ l a b e l {2}
Se nos pide conseguir una funcionalidad similar usando las librerías ITK. El primer
paso será escribir el archivo CMakeLists.txt
1 # Indicamos e l nombre que queremos que t e n g a n u e s t r o p r o y e c t o
2 PROJECT( B i n o m i a l F i l t r o )
3
4 #Buscamos
l i b r e r i a s de ITK
5 FIND PACKAGE(ITK REQUIRED)
6 INCLUDE( ${ITK USE FILE} )
7 # Indicamos que e l p r o y e c t o va a c r e a r una l i b r e r i a e i n d i c a m o s
l o s
a r c h i v o s que van a dar
l u g a r a l a l i b r e r i a
8 # Deben e s t a r c r e a d o s a n t e s de e j e c u t a r CMake
9 ADD EXECUTABLE( Binom
10
11
Binomial . cpp
Binomial . h
12
13 )
14 TARGET LINK LIBRARIES( Binom
${ITK LIBRARIES}
15
16 )
17 CMAKE MINIMUM REQUIRED(VERSION 2 . 6 )
3
A partir de ello, se determinan las carpetas donde se encuentran los Fuentes (Bi-
nomial.h y Binomial.cpp) y dónde queremos que se guarden los Binarios. Del filtro
solo se configurarán la imagen de entrada y el número de repeticiones que deseamos
que se ejecute. Por lo que, se tendrán como parámetros la imagen cameraman.tif
sobre la que se aplicará, el número de iteraciones elegidas (en nuestro caso 10) y la
imagen filtrada de salida.
1 t y p e d e f u n s i g n e d c h a r num ;
2 // Imagenes en 2D
3 c o n s t u n s i g n e d i n t numDims = 2 ;
4 t y p e d e f
i t k : : Image< u n s i g n e d char , numDims > ImageEnt ; // Imagen de
Entrada
5 t y p e d e f
i t k : : Image< u n s i g n e d char , numDims > ImageSal ;
// Imagen de
S a l i d a
6 t y p e d e f
7 t y p e d e f
8 t y p e d e f
i t k : : ImageFileReader < ImageEnt > ReaderType ;
i t k : : I m a g e F i l e W r i t e r < ImageSal > WriterType ;
i t k : : B i n o m i a l B l u r I m a g e F i l t e r <ImageEnt ,
ImageSal> B i n B l u r F i l t e r ;
4
3.2 Resultado
Se muestra el resultado con las ITK y se compara con el obtenido tras la imple-
mentación desde Matlab con la función binomialMatlab llamada 10 veces.
Figure 3.1: Imagen de entrada
Figure 3.2: ITK - Imagen de salida
Figure 3.3: binomialMatlab - Imagen de salida
El resultado es muy similar pero por diferencias en la implementación, si se ob-
servan detenidamente pixel a pixel se verá que no son iguales.
5
4 MEX
Las funciones MEX son muy útiles, ya que nos permiten emplear código escrito en
C/C+ desde Matlab.
4.1 Filtro binomial
Al igual que en el caso anterior, se pide implementar un filtro binomial que tenga la
funcionalidad descrita.
Sin embargo, para llevarlo se tienen en cuenta previamente las siguientes consid-
eraciones:
• Los bordes que conforman el borde será necesario replicar los valores antes de
aplicar el filtro
• Será necesario convertir los valores de unsigned char a coma flotante para el
caso de la entrada, y hacer la conversión opuesta para la salida.
• Debido a que la convolución de la imagen coincide con la correlación de la
misma con la máscara, por ser esta simétrica, se usará correlación a diferencia
de las ITK (además de ser más facil de implementar)
• Se dividirá la imagen en 9 partes para facilitar nuevamente la implementación.
En cuanto al CMakeLists.txt empleado:
1 PROJECT( f i l t r o B i n )
2 IF (WIN32) # Windows
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
SET(MATLAB LIB [HKEY LOCAL MACHINE\\SOFTWARE\\MathWorks\\MATLAB
SET(MATLAB INC ” [HKEY LOCAL MACHINE\\SOFTWARE\\MathWorks\\MATLAB
\\ 7 . 1 0 ;MATLABROOT] / e x t e r n / l i b / win64 / m i c r o s o f t )
\\ 7 . 1 0 ;MATLABROOT] / e x t e r n / i n c l u d e ” )
FIND LIBRARY(MATLAB MEX LIBRARY
libmex
${MATLAB LIB}
)
FIND LIBRARY(MATLAB MX LIBRARY
libmx
${MATLAB LIB}
)
FIND LIBRARY(MATLAB ENG LIBRARY
l i b e n g
${MATLAB LIB}
)
FIND PATH(MATLAB INCLUDE
”mex . h”
${MATLAB INC}
23
)
24 INCLUDE DIRECTORIES( ${MATLAB INCLUDE} )
ADD LIBRARY( f i l t B i n MODULE
25
26
6
27
u m b r a l i z a c i o n C . cpp
u m b r a l i z a c i o n C . h
28
29 )
30 IF (WIN32) # Windows
31
32
33
34
35
36
IF (CMAKE SIZEOF VOID P EQUAL 4 )
# 32 b i t s
SET TARGET PROPERTIES( f i l t B i n PROPERTIES SUFFIX ” . mexw32 ” )
ELSE(CMAKE SIZEOF VOID P EQUAL 4 ) # 64 b i t s
SET TARGET PROPERTIES( f i l t B i n PROPERTIES SUFFIX ” . mexw64 ” )
ENDIF(CMAKE SIZEOF VOID P EQUAL 4 )
37
38 ENDIF(WIN32)
39
40 # Indicamos que l a l i b r e r i a c r e a d a va a s e r de t i p o MEX
41 ADD DEFINITIONS(−DMATLAB MEX FILE)
42 IF (WIN32)
43
44
45
SET TARGET PROPERTIES( f i l t B i n
PROPERTIES
LINK FLAGS ”/ e x p o r t : mexFunction ”
)
46
47 ENDIF(WIN32)
l i b r e r i a s
i n t e r f a z
e n t r e Matlab y C++
48
49 #I n c o r p o r a r
50 SET(MATLAB LIBRARIES
l a s
${MATLAB MEX LIBRARY}
${MATLAB MX LIBRARY}
${MATLAB ENG LIBRARY}
53
54 )
55 TARGET LINK LIBRARIES( f i l t B i n
${MATLAB LIBRARIES}
51
52
56
57 )
Posteriormente, para la obtención del resultado final es necesario implementar la
siguiente función de test:
1 f u n c t i o n imgSal = t e s t ( )
2 imgEnt=imread ( ’ cameraman . t i f ’ ) ;
3 imgSal=f i l t B i n ( imgEnt ) ;
4 imshow ( [ imgEnt , imgSal ] ) ;
5
6 end
Siendo fitlBin el archivo obtenido después de compilar los binarios en Release con
Visual Studio.
En este caso, únicamente se tendrá como parámetro de entrada la imagen a aplicar
el filtro, en nuestro caso la ya tratada cameraman.tif
7
4.2 Resultado
Se obtienen los siguientes resultados:
Figure 4.1: Resultados con MEX
Figure 4.2: Resultados con binomialMatlab
8
5 OPENMP
La interfaz de programación de aplicaciones (API) OpenMp (Open Multi-Processing)
está destinada a la programación multiproceso de memoria compartida en múltiples
plataformas.
Permite el procesamiento en paralelo de programas escritos en C, C++ o Fortran.
Consiste además en un conjunto de directivas para el compilador, unas bibliotecas
de funciones y una serie de variables de entorno que controlan el comportamiento
de la ejecución.
Se basa en la existencia de múltiples hilos de ejecución que comparten una región
de memoria.
5.1 Paralelización bwDistC
Para esta parte, se partirá del código fuente en C++, bwDistC el cual implementa
la función bwdist que calcula para cada píxel de entrada la distancia más cercana a
un valor distinto de cero próximo a él. Tanto para la entrada como para la salida,
se usarán matrices lo que facilitará que se ejecute en paralelo.
El objetivo es probar a paralelizar distintas regiones del código y determinar cuál
es la más adecuada mediante una comparación de tiempos.
5.2 Resultado
5.2.1 Primera comprobación
Se hace paralelismo en la inicialización. Para poder llevarlo a cabo será necesario
modificar la siguiente línea de código:
1 #pragma omp p a r a l l e l
f o r
2 f o r ( i =0; i <numElem ; i ++) {
imgAntes [ i ]= imgIn [ i ] ;
imgOut [ i ] = 0 ;
3
}
4
5
s c h e d u l e ( g u i d e d )
Con la directiva pragma omp for se consigue que las iteraciones del del bucle
for que acompaña sean ejecutadas en paralelo. En el momento de la ejecución, las
iteraciones se distribuyen entre todos los hilos que se lancen.
9
Tras obtener los Binarios, obtener bwDistC.mexw64 compilando desde Release en
Visual Studio y gracias al script scriptBWDist.m con la imagen dada BWHig se ha
obtenido lo siguiente:
El código de C ha tardado una media de: 1.331467 s
El código de C paralelizado ha tardado una media de: 1.272789 s
Se observa que gracias a la paralelización se minoriza el tiempo.
5.2.2 Segunda comprobación
Se realiza nuevamente otra prueba haciendo paralelismo en el bucle for de dilatación:
s c h e d u l e ( g u i d e d )
1 #pragma omp p a r a l l e l
f o r
2 f o r ( k=0;k<n s l i c e s ; k++) {
f o r ( j =0; j <n c o l ; j ++) {
3
f o r ( i =0; i <nrow ; i ++) {
i n d = i+j ∗nrow+k∗ numElemSlice ;
i f ( imgDespues [ i n d ]= imgAntes [ i n d ] )
c o n t i n u e ;
i f ( i −1>=0)
i f ( imgDespues [ i n d ]= imgAntes [ ind −1])
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
c o n t i n u e ;
i f ( i +1<nrow )
i f ( imgDespues [ i n d ]= imgAntes [ i n d +1])
c o n t i n u e ;
i f ( j
Comentarios de: ITK, MEX y OpenMP (0)
No hay comentarios