Fundamentos del procesamiento de imágenes médicas

BE3027 - Robótica Médica

¿Por qué?

Antes de imágenes médicas, establezcamos fundamentos del procesamiento de imágenes normales

I = imread('filename.png')
imshow(I) % imageViewer(I)
j
i
j
i
\mathbf{I}
I[i,j]
I(i,j)
I = imread('filename.png')
imshow(I) % imageViewer(I)

pixel = picture element

pixel = picture element

¿Qué valores toman los pixeles?

depende del proceso de formación de imagen y del espacio de color

Formación de imágenes

para imágenes convencionales \(\to\) intensidad de luz

Escala de grises

gray = rgb2gray(I)

Espacio de color RGB

Otros espacios de color

HSV = rgb2hsv(RGB)

Otros espacios de color

L*a*b* (CIELAB)

lab = rgb2lab(RGB)

YCbCr

YCBCR = rgb2ycbcr(RGB)

CMYK

¿Qué es lo complicado de lidiar con imágenes?

exceso de información semántica

there's more than meets the eye

tendremos que conformarnos con el uso de features (características)

tendremos que conformarnos con el uso de features (características)

bordes

tendremos que conformarnos con el uso de features (características)

bordes

funciones matemáticas

tendremos que conformarnos con el uso de features (características)

bordes

puntos característicos

funciones matemáticas

tendremos que conformarnos con el uso de features (características)

bordes

puntos característicos

funciones matemáticas

segmentos

tendremos que conformarnos con el uso de features (características)

bordes

puntos característicos

funciones matemáticas

segmentos

entre otras muchas más...

los cambios de intensidad como herramienta para detección de features

Bordes

Histograma

imhist(I)

Algunas operaciones básicas de procesamiento de imágenes

Ecualización de histograma

J = histeq(I)

Thresholding

una imagen a color o en escala de grises

una imagen binaria (blanco y negro)

condición | if

R_{min}< R < R_{max} \\ G_{min}< G < G_{max} \\ B_{min}< B < B_{max}
d = \sqrt{(R-R_0)^2+(G-G_0)^2+(B-B_0)^2}
d < \epsilon

Filtrado LTI

G
J[i,j] = I[i,j] * G[i,j]= \displaystyle \sum_{a=0}^{N_{cols}-1} \sum_{b=0}^{N_{rows}-1} I[i,j] G[i-a,j-b]
J = imfilter(I, G)

Filtrado LTI

G
J[i,j] = I[i,j] * G[i,j]= \displaystyle \sum_{a=0}^{N_{cols}-1} \sum_{b=0}^{N_{rows}-1} I[i,j] G[i-a,j-b]
J = imfilter(I, G)

kernel

Smoothing | Suavizado

J = imgaussfilt(I, sigma)

box filter

G = \dfrac{1}{9}\begin{bmatrix} 1 & 1 & 1 \\ 1 & 1 & 1 \\ 1 & 1 & 1 \end{bmatrix}

Gaussian blur

G_\sigma[i,j] = \dfrac{1}{2\pi \sigma^2} \exp{\left(-\dfrac{i^2+j^2}{2\sigma^2}\right)}
\sigma=0.5
\sigma=1
\sigma=2
\sigma=4
\sigma=8
\sigma=16

Aplicaciones de suavizado

de-noising

remoción de detalles

\(\Rightarrow\) suavizado \(\equiv\) filtrado pasa-bajas

Sharpening | Afilado

operación contraria al suavizado

\(\equiv\) filtrado pasa-altas \(\approx\) resaltado de detalles

G = \begin{bmatrix} 0 & -1 & 0 \\ -1 & 5 & -1 \\ 0 & -1 & 0 \end{bmatrix}

sharpen filter (ejemplo)

puede emplearse suavizado para obtener afilado mediante unsharp masking

J[u,v]=I[u,v]+\lambda R[u,v]=(1+\lambda)I[u,v]-\lambda S[u,v]
R[u,v]=I[u,v]-S[u,v]

factor de escalamiento

versión suavizada de \(I\)

residual:

\nabla I(i,j)=\displaystyle \begin{bmatrix} \dfrac{\partial I}{\partial i} & \dfrac{\partial I}{\partial j} \end{bmatrix}^\top
\nabla^2 I=\displaystyle \dfrac{\partial^2 I}{\partial i^2} + \dfrac{\partial^2 I}{\partial j^2}

De detalles a bordes

Kernels para calcular derivadas

G_x = \dfrac{1}{2} \begin{bmatrix} -1 & 0 & 1 \\ -2 & 0 & 2 \\ -1 & 0 & 1 \end{bmatrix}
G_y = \dfrac{1}{2} \begin{bmatrix} -1 & -2 & -1 \\ 0 & 0 & 0 \\ 1 & 2 & 1 \end{bmatrix}

kernels de Sobel

= derivada de segundo orden + suavizado

Kernels para calcular derivadas

G_x = \dfrac{1}{2} \begin{bmatrix} -1 & 0 & 1 \\ -2 & 0 & 2 \\ -1 & 0 & 1 \end{bmatrix}
G_y = \dfrac{1}{2} \begin{bmatrix} -1 & -2 & -1 \\ 0 & 0 & 0 \\ 1 & 2 & 1 \end{bmatrix}

kernels de Sobel

= derivada de segundo orden + suavizado

se emplean como base para detectores de bordes más sofisticados, como el Canny edge detector

BW = edge(I, method) % 'Canny' en el ejemplo

Puntos característicos

points = detectHarrisFeatures(I)

detector de esquinas de Harris–Stephens

FAST features

points = detectSIFTFeatures(I)
points = detectFASTFeatures(I)

SIFT features

ORB features

points = detectSURFFeatures(I)
points = detectORBFeatures(I)

SURF features

Transformada de Hough

[H,theta,rho] = hough(BW)
centers = imfindcircles(A,radius)

Análisis de regiones

stats = regionprops(BW, properties)

Segmentación

imageSegmenter(I)