Guía 2 Facultad: Ingeniería. Escuela: Biomédica Asignatura: Imágenes Médicas Operaciones básicas con imágenes Objetivos Que el estudiante complete una plataforma de conocimientos fundamentales (ideas, terminología, etc.) en torno a los cuales habrá de girar el resto del curso. Que el estudiante sea capaz de interpretar y operar algoritmos que posibiliten la realización de operaciones geométricas de imágenes. Recomendaciones • Tenga orden y aseo para trabajar • Siempre que tenga duda del procedimiento a realizar, consúltelo con el docente. • Al finalizar el laboratorio se debe dejar en la misma condición en que se encontró, aún los accesorios y herramientas utilizadas. Materiales y equipos Computadora con MatLab y Processing Image Toolbox 1 Guía 2 Procedimiento 1. Cargue a MATLAB las siguientes imágenes: >> [a,m1]=imread('HWRsin2d_128x128_01_gray.jpg'); >> [b,m2]=imread('HWRsin2d_128x128_03_gray.jpg'); >> [c,m3]=imread('HWRsin2d_128x128_05_gray.jpg'); 2. Verifique las imagines en el Workspace: >> whos Name Size Bytes Class a 128x128 16384 uint8 array b 128x128 16384 uint8 array c 128x128 16384 uint8 array m1 0x0 0 double array m2 0x0 0 double array m3 0x0 0 double array Grand total is 49152 elements using 49152 bytes OPERACIONES ARITMÉTICAS Suma En su forma más sencilla, la operación suma toma como entrada dos imágenes de tamaño idéntico y produce como salida una tercera imagen del mismo tamaño de las primeras dos, en la cual cada valor de píxel es la suma de los valores de los píxel correspondientes de cada una de las dos imágenes de entrada. Existen versiones más sofisticadas que permiten la combinación de más de dos imágenes con una única operación. Una variante común permite adicionar una constante especifica a cada píxel. La adición de dos imágenes se lleva en un único paso. Los valores de los píxel del resultado vienen dados por: 2 Guía 2 Q(i, j ) = P1 (i, j ) + P2 (i, j ) O si solamente se desea adicionar un valor constante C a una imagen, entonces: Q(i, j ) = P1 (i, j ) + C Si los valores de los píxel en las imágenes de entrada son realmente vectores en lugar de valores escalares (por ejemplo, imágenes a color) entonces los componentes individuales (componentes rojo, azul y verde) se adicionan separadamente para producir el valor de salida. Si el formato de la imagen que se esta utilizando soporta únicamente valores de píxel enteros de 8 bits, es bastante probable que el resultado de la adición sea mayor que el máximo permitido por el valor del píxel. El efecto de ello, dependerá de la implementación. Los valores de píxel desbordados, deben tratarse de tal forma que se correspondan con los máximos valores permitidos. Si el formato de la imagen soporta valores con un rango de valores mucho más grande, por ejemplo un entero de 32 bits o números de puntos flotantes, este problema no tiene tanta ocurrencia. Resta En su forma más sencilla, la operación resta toma como entrada dos imágenes y produce como salida una tercera imagen en la cual cada valor de píxel es la resta de los valores de los píxel de la primera imagen menos sus correspondientes de la segunda imagen. Una variante común permite simplemente una constante especificada ser sustraída a cada píxel. Existen versiones que solamente producen la diferencia absoluta entre valores de píxel, en lugar de una salida signada. La sustracción de dos imágenes se lleva a cabo en un único paso. Los valores de los píxel del resultado vienen dados por: Q(i, j ) = P1 (i, j ) − P2 (i, j ) O si la operación únicamente calcula las diferencias absolutas entre las dos imágenes de entrada: Q(i, j ) = P1 (i, j ) − P2 (i, j ) O si solamente se desea sustraer un valor constante C a una imagen simple, entonces: Q(i, j ) = P1 (i, j ) − C 3 Guía 2 Si los valores de los píxel en las imágenes de entrada son realmente vectores en lugar de valores escalares (por ejemplo, imágenes a color) entonces los componentes individuales (componentes rojo, azul y verde) se sustraen separadamente para producir el valor de salida. Diversas implementaciones de la operación varían respecto de lo que hacen si los valores del píxel de salida son negativos. Algunos trabajan con formatos de imagen que soportan píxeles con valores negativos, en cuyo caso la forma en que se desplegaran dependerá del mapa de colores. Si el formato de la imagen no soporta valores negativos, a menudo tales píxeles se ajustan a cero, con lo cual se tiene una imagen típicamente negra. De manera alterna, el 1 operador puede usar el método ‘wrap’ para los valores negativos, con lo que -30 aparecería en el resultado como 226 (asumiendo píxeles de 8 bits). Si la operación calcula las diferencias absolutas y las dos imágenes de entrada utilizan el mismo tipo de valor de píxel, es imposible entonces que los valores del píxel de salida estén fuera de rango, respecto al tipo de píxel de entrada. 3. Dado que las imágenes son de la misma medida, se puede hacer la operación de suma o resta directamente indicando la operación, así: >> clear, close all >> a=double(a); >> b=double(b); >> c=double(c); >> d=a-b; >> e=a-c; >> f=b+c; >> figure(1),subplot(3,3,1),imshow(a,m1),title('a'); >> figure(1),subplot(3,3,4),imshow(b,m2) ,title('b'); >> figure(1),subplot(3,3,7),imshow(d,m1) ,title('a-b'); >> figure(1),subplot(3,3,2),imshow(a,m1) ,title('a'); >> figure(1),subplot(3,3,5),imshow(c,m3) ,title('c'); >> figure(1),subplot(3,3,8),imshow(e,m1) ,title('a-c'); >> figure(1),subplot(3,3,3),imshow(b,m2) ,title('b'); >> figure(1),subplot(3,3,6),imshow(c,m3) ,title('c'); >> figure(1),subplot(3,3,9),imshow(f,m2) ,title('b+c'); 4. Escriba el siguiente archivo m que realiza la Suma de dos imágenes, no importando que >> clear, close all ambas sean de diferente tamaño: 1 Significa que si el valor es más grande que el valor posible, se sustrae el rango de valores de píxel de tal forma que el valor inicie desde el valor mínimo posible. 4 Guía function c=suma(a,b) a=double(a); b=double(b); n = min([size(a,1) size(b,1)]); m = min([size(a,2) size(b,2)]); for i=1:n for j=1:m c(i,j)=a(i,j)+b(i,j); end end c=uint8(c); 5. Para la Resta lo único que se ha de cambiar es el signo: function c=resta(a,b) a=double(a); b=double(b); n = min([size(a,1) size(b,1)]); m = min([size(a,2) size(b,2)]); for i=1:n for j=1:m c(i,j)=a(i,j)-b(i,j); end end c=uint8(c); 6. Cargue las siguientes imágenes: >> [a256,m256] = imread('padro_256x256.jpg'); >> [a512,m512] = imread('padro_512x512.jpg'); 7. Realice las siguientes operaciones: >> c=suma(a256,a512); >> d=resta(a512,a256); 2 5 Guía 2 >> figure(1),subplot(1,3,1),imshow(a256,m256),title('a256 (256x256)'); >> figure(1),subplot(1,3,2),imshow(a512,m512),title('a512 (512x512)'); >> figure(1),subplot(2,3,3),imshow(c,m512),title('a256+a512'); >> figure(1),subplot(2,3,6),imshow(d,m512),title('a512-a256'); 8. Evalúe el resultado obtenido Multiplicación Como sucede con otras operaciones aritméticas, la multiplicación presenta dos formas principales. La primera forma toma dos imágenes de entrada y produce una imagen de salida en la cual los valores de los píxeles son solo aquellos de la primera imagen multiplicados por los valores correspondientes en la segunda imagen. La segunda forma toma una única imagen de entrada y produce un resultado en el cual cada valor de píxel es multiplicado por una constante, la cual debe ser especificada. Esta última forma es probablemente la más ampliamente utilizada, en un proceso conocido como escalado. (Este escalado en nivel de grises, no debe confundirse con el escalado geométrico) La multiplicación de dos imágenes se desarrolla de la siguiente forma: Q(i, j ) = P1 (i, j ) × P2 (i, j ) Luego, el escalado por una constante sigue la siguiente formulación matemática: Q(i, j ) = P1 (i, j ) × C La constante en este caso, es a menudo un punto flotante, y puede ser menor que uno, en cuyo caso se reducirá la intensidad de la imagen. Este puede incluso ser negativo si el formato de la imagen lo soporta. Si los valores de píxel en las imágenes de entrada son realmente vectores en lugar de valores escalares (por ejemplo, imágenes a color) entonces los componentes individuales (componentes rojo, azul y verde) se multiplican separadamente para producir el valor de salida. Si los valores calculados son mas grandes que el máximo permitido por el valor del píxel, entonces deben ser truncados al máximo valor, o sufrir el mismo procedimiento ‘wrap’ antes descrito. 9. Para la Multiplicación de una imagen por una constante: >> clear, close all >> [a,m1]=imread('HWRsin2d_128x128_01_gray.jpg'); >> a=double(a); 6 Guía 2 >> a_mult1=0.5*a;a_mult1=uint8(a_mult1); >> a_mult2=2*a;a_mult2=uint8(a_mult2); >> a_mult3=4*a;a_mult3=uint8(a_mult3); >> a_mult4=8*a;a_mult4=uint8(a_mult4); >> a=uint8(a); >> figure (1),subplot(1,5,1),imshow(a),title('a'); >> figure (1),subplot(1,5,2),imshow(a_mult1),title('0.5*a'); >> figure (1),subplot(1,5,3),imshow(a_mult2),title('2*a'); >> figure (1),subplot(1,5,4),imshow(a_mult3),title('4*a'); >> figure (1),subplot(1,5,5),imshow(a_mult4),title('8*a'); 10. Evalúe el resultado obtenido División La operación de división de imágenes, toma normalmente dos imágenes como entrada y produce una tercera cuyos valores de píxel son los valores de píxel de la primera imagen dividido por los valores de píxel correspondientes de la segunda imagen. Muchas implementaciones pueden ser utilizadas con una única imagen de entrada, en cuyo caso cada valor de píxel en la imagen se divide por una constante específica. La división de dos imágenes es desarrollada mediante la siguiente formulación matemática: Q(i, j ) = P1 (i, j ) ÷ P2 (i, j ) Luego, la división por una constante se define de la siguiente manera: Q(i, j ) = P1 (i, j ) ÷ C Si los valores de los píxel en las imágenes de entrada son realmente vectores en lugar de valores escalares (por ejemplo, imágenes a color) entonces los componentes individuales (componentes rojo, azul y verde) se dividen separadamente para producir el valor de salida. Operación AND La operación AND toma dos imágenes binarias o en niveles de grises como entrada, produciendo una tercera imagen resultado, cuyos valores de píxel son los que se encuentren en la primera imagen, “Y” que se encuentren en la segunda en el píxel correspondiente. Una 7 Guía 2 variación de esta operación toma únicamente una imagen y verifica la función AND con un valor constante específico, con lo cual se obtiene un resultado. La operación se desarrolla en un único paso. Es importante que todos los valores píxel de entrada se operen teniendo el mismo número de bits. En aquellos valores de píxel de la imagen de entrada que no son simples números binarios (1-bit), la operación AND normalmente se desarrolla individualmente sobre cada bit correspondiente en los valores píxel. La aplicación más obvia de la operación AND es calcular la intersección de dos imágenes. Operación OR La operación OR (y de manera similar la NOR), toma dos imágenes binarias o en escalas de grises como entrada, y proporciona como resultado una tercera imagen cuyos valores píxel de salida son los de la primera imágenes, “O” los píxeles correspondientes de la segunda. Una variación de esta operación toma solamente una única imagen y desarrolla la operación OR de cada píxel con un valor específico. La operación se desarrolla en un único paso. Es importante que todos los valores píxel de entrada se operen teniendo el mismo número de bits. En aquellos valores de píxel de la imagen de entrada que no son simples números binarios (1-bit), la operación OR normalmente se desarrolla individualmente sobre cada bit correspondiente en los valores píxel. Operación NOT La operación lógica NOT, toma una imagen binaria o en escala de grises como entrada y produce su negativo fotográfico, es decir, las áreas oscuras en la imagen de entrada se vuelven claras y viceversa. En otras palabras, mediante la aplicación de la operación NOT a una imagen binaria, se cambia su polaridad. La operación NOT puede ser utilizada en imágenes en escalas de grises siendo almacenada en formato de píxel de byte aplicándole una operación a nivel de bits. El valor resultante para cada píxel es el valor de entrada sustraído de 255, que es el valor máximo posible. Q(i, j ) = 255 − P1 (i, j ) Algunas aplicaciones de la inversión soportan valores enteros (integer) o de punto flotante (float point). En este caso, no se puede utilizar la función lógica NOT, por lo tanto lo valores píxel de la imagen invertida vienen dados por: Q(i, j ) = − P1 (i, j ) 8 Guía 2 2 Si esta imagen de salida se normaliza (8-bits), se puede obtener el negativo fotográfico de la imagen original. 11. Escriba los siguientes archivos .m que realizan las operaciones And y Or respectivamente de imágenes binarizadas: function c=and(a,b) n = min([size(a,1) size(b,1)]); m = min([size(a,2) size(b,2)]); for i=1:n for j=1:m c(i,j)=a(i,j)&b(i,j); end end function c=or(a,b) n = min([size(a,1) size(b,1)]); m = min([size(a,2) size(b,2)]); for i=1:n for j=1:m c(i,j)=a(i,j)|b(i,j); end end 12. Realice el siguiente procedimiento: >> [a_bin,m_bin1]=imread('damero1.bmp'); >> [b_bin,m_bin2]=imread('damero2.bmp'); >> y_bin=and(a_bin,b_bin); >> z_bin=or(a_bin,b_bin); >> figure (1), subplot (1,3,1), imshow(a_bin); title('a_ bin'); >> figure (1), subplot (1,3,2), imshow(b_bin); title('b_ bin'); 2 Es una técnica simple de mejora de imágenes que intenta mejorar el contraste en una imagen mediante la extensión del rango de valores de intensidad que contiene para abarcar un rango deseado de valores (por ejemplo, el rango completo de valores de píxel que un tipo específico de imagen permite). Este difiere de los histogramas de ecualización más sofisticado en que solo puede aplicar una función de escalado lineal. 9 Guía 2 >> figure (1), subplot (2,3,3), imshow(y_bin);title('Operación And'); >> figure (1), subplot (2,3,6), imshow(z_bin);title('Operación Or'); 13. Evalue el resultado obtenido OPERACIONES PUNTUALES Thresholding Brief Description In many vision applications, it is useful to be able to separate out the regions of the image corresponding to objects in which we are interested, from the regions of the image that correspond to background. Thresholding often provides an easy and convenient way to perform this segmentation on the basis of the different intensities or colors in the foreground and background regions of an image. In addition, it is often useful to be able to see what areas of an image consist of pixels whose values lie within a specified range, or band of intensities (or colors). Thresholding can be used for this as well. How It Works The input to a thresholding operation is typically a grayscale or color image. In the simplest implementation, the output is a binary image representing the segmentation. Black pixels correspond to background and white pixels correspond to foreground (or vice versa). In simple implementations, the segmentation is determined by a single parameter known as the intensity threshold. In a single pass, each pixel in the image is compared with this threshold. If the pixel's intensity is higher than the threshold, the pixel is set to, say, white in the output. If it is less than the threshold, it is set to black. In more sophisticated implementations, multiple thresholds can be specified, so that a band of intensity values can be set to white while everything else is set to black. For color or multispectral images, it may be possible to set different thresholds for each color channel, and so select just those pixels within a specified cuboid in RGB space. Another common variant is to set to black all those pixels corresponding to background, but leave foreground pixels at their original color/intensity (as opposed to forcing them to white), so that that information is not lost. Guidelines for Use Not all images can be neatly segmented into foreground and background using simple thresholding. Whether or not an image can be correctly segmented this way can be determined by looking at an intensity histogram of the image. We will consider just a grayscale histogram here, but the extension to color is trivial. If it is possible to separate out the foreground of an image on the basis of pixel intensity, then the intensity of pixels within foreground objects must be distinctly different from the intensity of pixels within the background. In this case, we expect to see a distinct peak in the histogram corresponding to foreground objects such that thresholds can be chosen to isolate this peak accordingly. If such a peak does not exist, then it is unlikely that simple thresholding will produce a good segmentation. In this case, adaptive thresholding may be a better answer. Figure 1 shows some typical histograms along with suitable choices of threshold. 10 Guía 2 Figure 1 A) shows a classic bi-modal intensity distribution. This image can be successfully segmented using a single threshold T1. B) is slightly more complicated. Here we suppose the central peak represents the objects we are interested in and so threshold segmentation requires two thresholds: T1 and T2. In C), the two peaks of a bi-modal distribution have run together and so it is almost certainly not possible to successfully segment this image using a single global threshold Adaptive Thresholding Brief Description Thresholding is used to segment an image by setting all pixels whose intensity values are above a threshold to a foreground value and all the remaining pixels to a background value. Whereas the conventional thresholding operator uses a global threshold for all pixels, adaptive thresholding changes the threshold dynamically over the image. This more sophisticated version of thresholding can accommodate changing lighting conditions in the image, e.g. those occurring as a result of a strong illumination gradient or shadows. How It Works Adaptive thresholding typically takes a grayscale or color image as input and, in the simplest implementation, outputs a binary image representing the segmentation. For each pixel in the image, a threshold has to be calculated. If the pixel value is below the threshold it is set to the background value, otherwise it assumes the foreground value. There are two main approaches to finding the threshold: (i) the Chow and Kaneko approach and (ii) local thresholding. The assumption behind both methods is that smaller image regions are more likely to have approximately uniform illumination, thus being more suitable for thresholding. Chow and Kaneko divide an image into an array of overlapping subimages and then find the optimum threshold for each subimage by investigating its histogram. The threshold for each single pixel is found by interpolating the results of the subimages. The drawback of this method is that it is computational expensive and, therefore, is not appropriate for real-time applications. 11 Guía 2 An alternative approach to finding the local threshold is to statistically examine the intensity values of the local neighborhood of each pixel. The statistic which is most appropriate depends largely on the input image. Simple and fast functions include the mean of the local intensity distribution, the median value, or the mean of the minimum and maximum values, The size of the neighborhood has to be large enough to cover sufficient foreground and background pixels, otherwise a poor threshold is chosen. On the other hand, choosing regions which are too large can violate the assumption of approximately uniform illumination. This method is less computationally intensive than the Chow and Kaneko approach and produces good results for some applications. Guidelines for Use Like global thresholding, adaptive thresholding is used to separate desirable foreground image objects from the background based on the difference in pixel intensities of each region. Global thresholding uses a fixed threshold for all pixels in the image and therefore works only if the intensity histogram of the input image contains neatly separated peaks corresponding to the desired subject(s) and background(s). Hence, it cannot deal with images containing, for example, a strong illumination gradient. Local adaptive thresholding, on the other hand, selects an individual threshold for each pixel based on the range of intensity values in its local neighborhood. This allows for thresholding of an image whose global intensity histogram doesn't contain distinctive peaks. TRANSFORMACIONES GEOMÉTRICAS 14. Escriba el siguiente archivo .m que realiza el Recorte (clipping) function b=recorte(a,cmin,cmax) 12 Guía if cmax<cmin | fix(cmax)-cmax~=0 | fix(cmin)-cmin~=0, return end n = size(a,1); m = size(a,2); for i=1:n for j=1:m if a(i,j)>cmax, b(i,j)=cmax; elseif a(i,j)>=cmin & a(i,j)<=cmax, b(i,j)=a(i,j); else b(i,j)=cmin; end end end b=uint8 (b); 15. Realice el siguiente procedimiento: >> [a_rec,m_rec]=imread('padro_tartan.jpg'); >> figure (1), subplot (1,2,1), imshow(a_rec); >> figure (1), subplot (1,2,2), imhist(a_rec); >> y1=recorte(a_rec, 0,128); >> figure (2), subplot (1,2,1), imshow(y1); >> figure (2), subplot (1,2,2), imhist(y1); >> y2=recorte(a_rec, 129,255); >> figure (3), subplot (1,2,1), imshow(y2); >> figure (3), subplot (1,2,2), imhist(y2); >> y3=recorte(a_rec, 200,255); >> figure (4), subplot (1,2,1), imshow(y3); >> figure (4), subplot (1,2,2), imhist(y3); 2 13 Guía 16. Ahora escriba el siguiente archivo que realiza el Umbralizado (thresholding): function c=umbral(a,x,y,t) a=double(a) [n,m] = size(a); for i=1:n for j=1:m if a(i,j)<t, c(i,j)=x; else c(i,j)=y; end end end c=uint8 (c); 17. Realice el siguiente procedimiento: >> [a_umb,m_umb]=imread('padro_tartan.jpg'); >> figure (1), subplot (1,2,1), imshow(a_umb); >> figure (1), subplot (1,2,2), imhist(a_umb); >> x1=umbral(a_umb,75,130,100); >> figure (2), subplot (1,2,1), imshow(x1); >> figure (2), subplot (1,2,2), imhist(x1); >> x2=umbral(a_umb, 100,200,130); >> figure (3), subplot (1,2,1), imshow(x2); >> figure (3), subplot (1,2,2), imhist(x2); >> x3=umbral(a_umb,100,200,150); >> figure (4), subplot (1,2,1), imshow(x3); >> figure (4), subplot (1,2,2), imhist(x3); 18. Evalue el resultado obtenido 2 14 Guía 2 19. La Traslación de la imagen se logra con la implementación del siguiente archivo .m function c=trasla(a,x,y) [m,n]=size(a); for i=1:m, for j=1:n, ii=i+y; jj=j+x; if ii>0 & jj>0, c(ii,jj)=a(i,j); end end end 20. Realice el siguiente procedimiento: >> zz=imread('MagiCesc.jpg'); >> figure (1), imshow(zz) >> [zz_ind,mzz]=rgb2ind(zz,256); >> zz_trasl=trasla(zz_ind,75,50); >> figure (2), imshow (zz_trasl,mzz); 21. La Rotación de la imagen para un ángulo de 0 a 180 grados en el sentido contrario de las agujas del reloj se logra escribiendo el siguiente archivo .m. function b=rot(a,ang) [m,n]=size(a); if ang>0 & ang<=pi/2, c=round(m*sin(ang)+n*cos(ang))+1; d=round(m*cos(ang)+n*sin(ang))+1; for i=1:c, for j=1:d, iii=i-n*sin(ang)-1; ii=round(j*sin(ang)+iii*cos(ang)); jj=round(j*cos(ang)-iii*sin(ang)); if ii>0 & ii<=m & jj>0 & jj<=n, 15 Guía 2 b(i,j)=a(ii,jj); end end end elseif ang>pi/2 & ang<=pi, c=round(m*sin(ang)-n*cos(ang))+1; d=round(m*sin(ang)-n*cos(ang))+1; %e=n*sin(ang-pi/2); e=-n*cos(ang); for i=1:c, for j=1:d, iii=i-c-1; jjj=j-e-1; ii=round(jjj*sin(ang)+iii*cos(ang)); jj=round(+jjj*cos(ang)-iii*sin(ang)); if ii>0 & ii<=m & jj>0 & jj<=n, b(i,j)=a(ii,jj); end end end end 22. Realice el siguiente procedimiento: >> [a_rot]=imread('brujula.jpg'); >> a_rot=rgb2gray(a_rot); >> figure(1),imshow(a_rot); >> b_rot=rot(a_rot,pi/3); >> figure(2),imshow(b_rot); 23. La Reflexión vertical (verefle) así como la Reflexión horizontal (horefle) y la Reflexión respecto al origen (orefle), se consiguen mediante los siguientes archivos .m. function c=verefle(a) [m,n]=size(a); for i=0:m-1, for j=1:n 16 Guía ii=m-i; if ii>0, c(ii,j)=a(i+1,j); end end end function c=horefle(a) [m,n]=size(a); for i=1:m, for j=0:n-1 jj=n-j; if jj>0, c(i,jj)=a(i,j+1); end end end function c=orefle(a) [m,n]=size(a); for i=0:m-1, for j=0:n-1 ii=m-i; jj=n-j; if ii>0 & jj>0, c(ii,jj)=a(i+1,j+1); end end end 2 17 Guía 2 Análisis de resultados En la parte de suma y resta, ¿Qué hubiese pasado si en lugar de restar a la imagen a512 la a256, hubiese desarrollado el procedimiento contrario? - ¿Que sucede cuando se divide una imagen entre una constante? - ¿Cómo se utiliza el comando IMDIVIDE? En el procedimiento 15, al sumar y1 y y3, ¿Por que no se consigue obtener la imagen original? - ¿Cual es la diferencia entre la función Umbral y la función Recorte? ¿Que es un histograma?, ¿Cuál es el procedimiento para ecualizar un histograma?, realice el procedimiento con una imagen diferente a las utilizadas en la práctica. - ¿Cómo se consigue el negativo de una imagen? Desarrolle los procedimientos para la Reflexión vertical, horizontal y con respecto al origen con una imagen médica que usted considere pertinente (que aporte elementos necesarios para poder evaluar la función). Investigación complementaria Investigue o desarrolle una función que tenga como argumentos de entrada 2 puntos: (i1, j1) y (i2, j2), que representen el vértice superior izquierdo y el vértice inferior derecho respectivamente, de una sub-región rectangular que desee ser extraída de la imagen original. Presente un procedimiento con su función desarrollada en una imagen médica que usted considere pertinente. Utilice al menos tres veces la función sobre la imagen y guárdelos con nombres diferentes. Información adicional http://www.imageprocessingplace.com/ http://www.mathtools.net/MATLAB/Image_Processing/ 18