You are on page 1of 71

Facultad de Ingenieras Fsico-Mecnicas Escuela de Ingenieras Elctrica, Electrnica y de Telecomunicaciones

CONSTRUIMOS FUTURO

ESCUELA DE INGENIERAS ELCTRICA, ELECTRNICA Y DE TELECOMUNICACIONES

Entrenamiento Da MATLAB 2008: Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB
MSc Leandro F. Ariza Jimnez
Grupo en Conectividad y Procesado de Seal (CPS)

CONSTRUIMOS FUTURO

Agenda
Introduccin Objetivo propuesto Tpicos propuestos Desarrollo metodolgico Manipulacin matricial en MATLAB Acondicionamiento y ejecucin del proceso de adquisicin de video e imgenes Procesamiento de imgenes y video utilizando MATLAB

Viernes, 1 de agosto de 2008 Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

Introduccin
Matrices y vectores MATLAB >> Matrix Laboratory Imgenes >> Arreglo matricial (matrix array) Videos >> Secuencia matricial (frames) Toolboxes: Image Acquisition Toolbox Image Processing Toolbox

Viernes, 1 de agosto de 2008 Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

Objetivo propuesto
Acercar a los participantes a travs de una sesin de cuatro horas a las capacidades de adquisicin y procesamiento de imgenes y videos soportadas por los correspondientes toolboxes de MATLAB.

Viernes, 1 de agosto de 2008 Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

Tpicos propuestos
Fundamentos de manipulacin matricial en MATLAB. Control del equipo de registro mediante MATLAB. Adquisicin de video e imgenes mediante MATLAB. Tcnicas bsicas de procesamiento de imgenes y video utilizando MATLAB.
Viernes, 1 de agosto de 2008 Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

Desarrollo metodolgico
FASE DE TRABAJO Manipulacin matricial en MATLAB Acondicionamiento y ejecucin del proceso de adquisicin de video e imgenes Procesamiento de imgenes y video utilizando MATLAB DURACIN

60 minutos 90 minutos 90 minutos

Viernes, 1 de agosto de 2008 Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

ESCUELA DE INGENIERAS ELCTRICA, ELECTRNICA Y DE TELECOMUNICACIONES

Manipulacin matricial en MATLAB

CONSTRUIMOS FUTURO

Manipulacin matricial en MATLAB


Vector fila
I (1, N ) = [I (1,1) I (1,2) I (1,3) K I (1, N )]1xN
I = [1 2 3 4 5] I = [1, 2, 3, 4, 5] I = [-2, -1, 0, 1, 2]

Viernes, 1 de agosto de 2008 Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

10

Manipulacin matricial en MATLAB


Vector columna
I (1,1) I (2,1) I ( M ,1) = I (3,1) M I ( M ,1) Mx1

I = [1; 2; 3; 4; 5]

I = [-2; -1; 0; 1; 2]

Viernes, 1 de agosto de 2008 Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

11

Manipulacin matricial en MATLAB


Matriz
I (1,2) I (1,3) I (1,1) I (2,1) I (2,2) I (2,3) I ( M , N ) = I (3,1) I (3,2) I (3,3) M M M I ( M ,1) I ( M ,2) I ( M ,3) K K K O K I (1, N ) I (2, N ) I (3, N ) M I ( M , N ) MxN

I = [1 2 3; 4 5 6; 7 8 9] I = [1, 2, 3; 4, 5, 6; 7, 8, 9]
Viernes, 1 de agosto de 2008 Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

12

Manipulacin matricial en MATLAB


Matriz: Escala de grises (grayscale)

256x256
Viernes, 1 de agosto de 2008 Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

13

Manipulacin matricial en MATLAB


MxNx3 MxNx2 MxNx1
I (1,1) I (2,1) (3 ,1 )) I (1,2) II (1 ,3 M2,3) I (2,2) I ( )) I (3,2) I (IM (3,,1 3

I (1,1) I (2,1) I ( M , N ,3) = I (3,1) M M M O M I ( M ,1) I ( M ,2) I ( M ,3) K I ( M , N )

I (1,2) I (1,3) I (1,1) I (2,1) I (2,2) I (2,3) ),3) I (K 3,2) I (1I 3,)3) I (1,2) I (3 I,1 N (1 ,( M I (2, N M) I (2,2) M I (2,3) K M I, ,1 (M ) K,2) I (3 IK (3,2) I I 3) ,)3) N ),3 I( N (1 ,( I ( M M M O M K I (2, N ) I( M ,2)I (3 I,(N M) ,3 ) K I ( M , N ) K

K K K O K

I (1, N ) I (2, N ) I (3, N ) M I ( M , N )

Matriz multidimensional
Viernes, 1 de agosto de 2008 Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

14

Manipulacin matricial en MATLAB


Matriz multidimensional: Color verdadero

256x256x3
Viernes, 1 de agosto de 2008 Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

15

Manipulacin matricial en MATLAB


Direccionamiento e indexacin Operaciones aritmticas entre matrices Operaciones lgicas sobre matrices Otras
Viernes, 1 de agosto de 2008 Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

16

Manipulacin matricial en MATLAB


Formacin de imgenes (adquisicin)

Viernes, 1 de agosto de 2008 Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

17

Manipulacin matricial en MATLAB


Formacin de imgenes (muestreo y cuantiz.)

Viernes, 1 de agosto de 2008 Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

18

Manipulacin matricial en MATLAB


Formacin de imgenes (muestreo y cuantiz.)

Viernes, 1 de agosto de 2008 Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

ESCUELA DE INGENIERAS ELCTRICA, ELECTRNICA Y DE TELECOMUNICACIONES

Acondicionamiento y ejecucin del proceso de adquisicin de video e imgenes

CONSTRUIMOS FUTURO

20

Image Adquisition Toolbox


Capacita a MATLAB para realizar un amplio conjunto de operaciones relacionadas con: Adquisicin de imgenes a travs de dispositivos de registro (webcams USB >> frame grabbers). Pre-visualizar un streaming de video en vivo. Triggering acquisitions. Ejecutar callbacks ante ciertos eventos de la adquisicin. Exportar datos de imagen y video al workspace de MATLAB
Viernes, 1 de agosto de 2008 Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

21

Pasos bsicos de la adquisicin a travs de MATLAB


Paso 0: Instalacin previa del dispositivo de adquisicin. Paso 1: Identificacin de las propiedades del dispositivo. Paso 2: Creacin de un objeto de adquisicin. Paso 3: Previsualizacin del streaming de video. Paso 4: Configuracin (adecuacin) de las propiedades del objeto de adquisicin. Paso 5: Adquisicin de datos de imagen o video. Paso 6: Clausura de la adquisicin.

Viernes, 1 de agosto de 2008 Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

22

Paso 1 - Propiedades del dispositivo


Propiedades claves para acceder al dispositivo: Nombre del adaptador Interfaz software de conexin Drivers ID - Identificador del dispositivo Formato de video del streaming Resolucin Composicin del video Funcin asociada: >> imaqhwinfo
Viernes, 1 de agosto de 2008 Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

23

Paso 1 - Propiedades del dispositivo


Determinar el nombre del adaptador: >> imaqhwinfo
ans = InstalledAdaptors: MATLABVersion: ToolboxName: ToolboxVersion: {'coreco' 'winvideo'} '7.5 (R2007b)' 'Image Acquisition Toolbox' '3.0 (R2007b)'

Determinar el ID del dispositivo: >> imaqhwinfo('winvideo')


ans = AdaptorDllName: AdaptorDllVersion: AdaptorName: DeviceIDs: DeviceInfo:
Viernes, 1 de agosto de 2008 Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

'C:\Program Files\\mwwinvideoimaq.dll' '3.0 (R2007b)' 'winvideo' {[1]} [1x1 struct]

24

Paso 1 - Propiedades del dispositivo


Determinar el formato de video del streaming:
>> imaqhwinfo('winvideo', 1)
ans = DefaultFormat: DeviceFileSupported: DeviceName: DeviceID: ObjectConstructor: SupportedFormats: 'RGB24_640x480' 0 'Laptop Integrated Webcam' 1 'videoinput('winvideo', 1)' {1x19 cell}

>> celldisp(ans.SupportedFormats)
Viernes, 1 de agosto de 2008 Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

25

Paso 2 - Creacin del objeto de adquisicin


Objeto de video Objeto de adquisicin Fuente de video Fuente de video Fuente de video

Objeto de video >> Representa la conexin entre MATLAB y el dispositivo de adquisicin. Fuente de video >> Un mismo objeto de video puede contener mltiples fuentes de video.
Viernes, 1 de agosto de 2008 Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

26

Paso 2 - Creacin del objeto de adquisicin


Creacin de un objeto de video:
>> vid = videoinput('winvideo',1,'RGB24_320x240');

Obtener informacin del objeto de video:


>> imaqhwinfo(vid) ans = AdaptorName: DeviceName: MaxHeight: MaxWidth: NativeDataType: TotalSources: VendorDriverDescription: VendorDriverVersion:
Viernes, 1 de agosto de 2008 Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

'winvideo' 'Laptop Integrated Webcam' 240 320 'uint8' 1 'Windows WDM Compatible Driver' 'DirectX 9.0'

27

Paso 2 - Creacin del objeto de adquisicin


>> vid
Summary of Video Input Object Using 'Laptop Integrated Webcam'. Acquisition Source(s): Acquisition Parameters: input1 is available. 'input1' is the current selected source. 10 frames per trigger using the selected source. 'RGB24_320x240' video data to be logged upon START. Grabbing first of every 1 frame(s). Log data to 'memory' on trigger. 1 'immediate' trigger(s) on START. Waiting for START. 10 frames acquired since starting. 10 frames available for GETDATA.

Trigger Parameters: Status:

Viernes, 1 de agosto de 2008 Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

28

Paso 3 - Previsualizacin del streaming de video

>> preview(vid) >> stoppreview(vid) >> closepreview(vid)

Viernes, 1 de agosto de 2008 Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

29

Paso 4 Configuracin del objeto de adquisicin


Adecuacin propiedades: Controlar las caractersticas del video y como se adquiere. Identificar propiedades del objeto de video: >> get(vid) Identificar propiedades de la fuente de video: >> get(getselectedsource(vid))
Viernes, 1 de agosto de 2008 Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

30

Paso 4 Configuracin del objeto de adquisicin


Identificar el valor de una propiedad especfica: >> get(vid,'Previewing') >> get(getselectedsource(vid),'Gamma') Obtener informacin de una propiedad especfica: >> propinfo(vid, 'VideoResolution') >> propinfo(getselectedsource(vid),'Hue') Obtener ayuda sobre una propiedad especfica: >> imaqhelp(vid, 'BayerSensorAlignment') >> imaqhelp(getselectedsource(vid),'Contrast')
Viernes, 1 de agosto de 2008 Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

31

Paso 4 Configuracin del objeto de adquisicin


Lista de propiedades que pueden modificarse (settable):
>> set(vid) >> set(getselectedsource(vid))

Modificacin de una propiedad especfica:


>> set(vid,'LoggingMode','disk&memory') >> set(getselectedsource(vid),'Sharpness', 10)

Viernes, 1 de agosto de 2008 Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

32

Paso 4 Configuracin del objeto de adquisicin

Ejemplo aplicado de adecuacin de las propiedades de la fuente de video:


>> gui_video_consola(vid)

Viernes, 1 de agosto de 2008 Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

33

Paso 5 Adquisicin de datos


Iniciar el objeto de video: Prepara el objeto para adquirir; algunas propiedades se tornan se slo lectura. >> start(vid)

Viernes, 1 de agosto de 2008 Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

34

Paso 5 Adquisicin de datos


Logging:
>> set(vid,'LoggingMode','disk') >> set(vid,'LoggingMode','memory') >> set(vid,'LoggingMode','disk&memory')

Viernes, 1 de agosto de 2008 Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

35

Paso 5 Adquisicin de datos


Trigger: Evento (inmediato o manual) que inicia la adquisicin propiamente (logging) de frames.
>> triggerconfig(vid) ans = TriggerType: 'immediate' TriggerCondition: 'none' TriggerSource: 'none'

Viernes, 1 de agosto de 2008 Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

36

Paso 5 Adquisicin de datos

Viernes, 1 de agosto de 2008 Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

37

Paso 5 Adquisicin de datos


Trigger inmediato:
>> start(vid) >> get(vid,'FramesAcquired')

Viernes, 1 de agosto de 2008 Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

38

Paso 5 Adquisicin de datos


Trigger manual:
>> >> >> >> triggerconfig(vid, 'manual') start(vid) trigger(vid) get(vid,'FramesAcquired')

Viernes, 1 de agosto de 2008 Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

39

Paso 5 Adquisicin de datos


FramesPerTrigger, FrameGrabInterval:
>> set(vid,'FramesPerTrigger',5) >> set(vid,FrameGrabInterval',2)

Viernes, 1 de agosto de 2008 Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

40

Paso 5 Adquisicin de datos


TriggerFrameDelay:
>> set(vid, 'TriggerFrameDelay',5)

Viernes, 1 de agosto de 2008 Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

41

Paso 5 Adquisicin de datos


TriggerRepeat:
>> set(vid,'TriggerRepeat',2)

Viernes, 1 de agosto de 2008 Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

42

Paso 5 Adquisicin de datos


Exportacin de frames

Viernes, 1 de agosto de 2008 Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

43

Paso 5 Adquisicin de datos


Exportacin de frames

Viernes, 1 de agosto de 2008 Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

44

Paso 5 Adquisicin de datos


Exportar frames: Buffer de memoria >> workspace Exportar mltiples frames con remocin
>> get(vid,'FramesAvailable') ans = 10 >> data = getdata(vid,5); >> get(vid,'FramesAvailable') ans = 5
Viernes, 1 de agosto de 2008 Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

45

Paso 5 Adquisicin de datos


Exportar frames: Buffer de memoria >> workspace Exportar mltiples frames sin remocin
>> get(vid,'FramesAvailable') ans = 10 >> pdata = peekdata(vid,5); >> get(vid,'FramesAvailable') ans = 10
Viernes, 1 de agosto de 2008 Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

46

Paso 5 Adquisicin de datos


Exportar frames: Buffer de memoria >> workspace
>> size(data) ans = 240 320 >> size(pdata) ans = 240 320

Viernes, 1 de agosto de 2008 Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

47

Paso 5 Adquisicin de datos


Visualizar multiples frames:
>> imaqmontage(data)

Viernes, 1 de agosto de 2008 Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

48

Paso 5 Adquisicin de datos


Visualizar un frame de una secuencia mltiple:
>> imshow(data(:,:,:,1))

Viernes, 1 de agosto de 2008 Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

49

Paso 5 Adquisicin de datos


Exportar un frame: Objeto de video >> workspace
>> vid = videoinput('winvideo',1,'RGB24_320x240'); >> frame = getsnapshot(vid); >> imshow(frame)

Viernes, 1 de agosto de 2008 Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

ESCUELA DE INGENIERAS ELCTRICA, ELECTRNICA Y DE TELECOMUNICACIONES

Procesamiento de imgenes y video utilizando MATLAB

CONSTRUIMOS FUTURO

51

Histograma

>> I = imread(cameraman.tif); >> figure, imshow(I); figure, imhist(I) Distribucin de la frecuencia con que aparecen los niveles de gris de una imagen. No aporta informacin sobre la distribucin espacial de los niveles de gris.
Viernes, 1 de agosto de 2008 Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

52

Contraste

Mide el rango dinmico de los niveles de gris en una imagen. Puede mejorarse por medio de una transformacin lineal.
Viernes, 1 de agosto de 2008 Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

53

Transformaciones de intensidad

J = imadjust(I, [low_in high_in], [low_out high_out], gamma)


Viernes, 1 de agosto de 2008 Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

54

Segmentacin
Subdivide una imagen en sus regiones constitutivas u objetos. Algunos algoritmos se basan en propiedades bsicas los niveles de intensidad: Discontinuidad Similitud
Viernes, 1 de agosto de 2008 Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

55

Segmentacin basada en umbralizacin


Asigna un valor lgico de 1 o 0 a los pxeles de una imagen segn un umbral de intensidad, T. Separa el objeto de inters del fondo de la escena.
1 si f ( x, y ) T g ( x, y ) = 0 si f ( x, y ) < T
Viernes, 1 de agosto de 2008 Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

Requiere condiciones controladas de registro, fondo uniforme, sin texturas, etc.

56

Segmentacin basada en umbralizacin


1000 900 800 700 600 500 400 300 200 100 0 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1

>> K = im2bw(I,0.3);
Viernes, 1 de agosto de 2008 Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

57

Filtrado espacial
Operaciones realizadas directamente sobre los pxeles de la imagen. Se convoluciona empleando una mscara de m x n con coeficientes.

R = w1 z1 + w2 z 2 + K + w9 z9
Se utilizan tcnicas de rellenado (padding).
Viernes, 1 de agosto de 2008 Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

R = wi zi
i =1

58

Filtro pasa-bajo

Otras mscaras:

Viernes, 1 de agosto de 2008 Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

59

Filtro paso-bajo (mediana)

No lineal y de ordenamiento estadstico. Computacionalmente ineficiente. Degrada la imagen en menor cuanta que otros filtros paso bajo. Excelente reduccin de ruido impulsivo (salt & pepper).

Viernes, 1 de agosto de 2008 Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

60

Filtro pasa-bajo

Imagen con ruido salt & pepper

Filtro promedio (mscara 3 x 3)

Filtro mediana (mscara 3 x 3)

Viernes, 1 de agosto de 2008 Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

61

Filtro pasa-alto
0 1 0 1 4 1 0 1 0
Otras mscaras:

1 1 1 1 8 1 1 1 1
Viernes, 1 de agosto de 2008

1 1 1

0 0 0

1 1 1

1 2 1

0 0 0

1 2 1

Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

62

Deteccin de bordes
Frontera entre dos regiones con nivel de gris relativamente diferentes.

Modelo ideal de un borde digital en rampa


Viernes, 1 de agosto de 2008 Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

Modelo en rampa de un borde digital

63

Deteccin de bordes
Detector de bordes >> Operador local de derivacin.

I ( x, y )

Operador diferencial

Umbral

Bordes

Viernes, 1 de agosto de 2008 Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

64

Deteccin de bordes
Gx I x I = = I Gy y
I = mag ( I ) = Gx 2 + Gy 2

Primera derivada >> operador gradiente.

I Gx + Gy
Viernes, 1 de agosto de 2008

Gy ( x, y ) = tan Gx
1

Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

65

Deteccin de bordes
Operador \ Deriv. Parcial

Gx
0 1 1 0 1 0 1 1 0 1 1 0 1 1 0 1 2 0 2 1 0 1

Gy
1 0 0 1 1 1 1 0 0 0 1 1 1 1 2 1 0 0 0 2 1 1

Prewitt

Roberts

Sobel
Viernes, 1 de agosto de 2008

Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

66

Deteccin de bordes

Imagen original
Viernes, 1 de agosto de 2008

Gx - Sobel

Gy - Sobel

Gradiente Sobel

Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

67

Deteccin de bordes
Derivada de segundo orden >> Laplaciano. Sensible en exceso al ruido, produce bordes dobles y no permite determinar direcciones.

I I I = 2 + 2 x y
2 2 2
Viernes, 1 de agosto de 2008

0 1 0 1 4 1 0 1 0

1 1 1 1 8 1 1 1 1

Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

68

Filtrado espacial mediante MATLAB


Procedimiento bsico: % Filtros predefinidos >> w = fspecial(tipo, parametro); % Filtro definido >> w = [a b c; d e f; g h i]; % Filtrado por convolucin >> J = imfilter(I, w, padding);
Viernes, 1 de agosto de 2008 Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

69

Bibliografa
GONZLEZ, Rafael C. y WOODS, Richard E. Digital Image Processing. 2da ed. New Jersey, Prentice Hall, 2002. 793 p. GONZLEZ, Rafael C., WOODS, Richard E. y EDDINS, Steven. Digital Image Processing Using MATLAB. New Jersey, Prentice Hall, 2004. 782 p. THE MATHWORKS, Image Adquisition Toolbox Users Guide. THE MATHWORKS, Image Processing Toolbox Users Guide.

Viernes, 1 de agosto de 2008 Taller de adquisicin y procesamiento de imgenes y video mediante MATLAB

ESCUELA DE INGENIERAS ELCTRICA, ELECTRNICA Y DE TELECOMUNICACIONES

Gracias por atencin

CONSTRUIMOS FUTURO

Viernes, 1 de agosto de 2008


CONSTRUIMOS FUTURO

You might also like