La limpieza de imágenes biomédicas consiste en obtener una imagen de la muestra de interés lo más pura posible. Esta imagen, normalmente se obtiene aplicando operaciones matemáticas sencillas, basadas en transformaciones globales, sobre las imágenes obtenidas a través del microscopio con el portaobjetos con y sin muestra.
La función que finalmente he desarrollado es muy sencilla y en ella no se puede controlar ningún parámetro, sino que devuelve un resultado unívoco para las imágenes de entrada. Si la función del parámetro está bien definida, es interesante no pasar por alto su contribución en un problema de índole aleatoria como es este, donde no conocemos las características de las imágenes de entrada (no con total determinismo).
En primer lugar restamos píxel a píxel el fondo a la imagen de la muestra contaminada con el ruido. Esto lo hacemos así y no a la inversa debido a que la muestra contrasta con el fondo por estar a contraluz, es decir, la muestra es más oscura. Si lo hiciésemos al contrario perderíamos mucha información siendo, en algunos casos, imposible dar una solución medianamente aceptable al problema.
Una vez restadas las imágenes, obtendremos un resultado bastante limpio, como es lógico, aunque con poco contraste. Por ello, le aplicamos stretching, cuya función de transferencia adjunto en la siguiente figura, así como el código de la función implementada en MatLab.
H(l) = 255(l - mín)/(max - mín)
Donde max y mín son los niveles de gris máximo y mínimo presentes en la imagen.
% STRETCHING
% Autor: Iván López Espejo
%
% y = stretch(x)
%
% Donde en 'y' se obtiene la imagen tras aplicar la operación, siendo % 'x' la imagen de entrada.
function y = stretch(x)
% Algunos parámetros necesarios.
minimo = double(min(min(x)));
maximo = double(max(max(x)));
filas = length(x(:,1));
columnas = length(x(1,:));
% Definición de la función de transferencia y aplicación.
for j = 1:1:filas
for k = 1:1:columnas
y(j,k) = round((255/(maximo-minimo))*double(x(j,k))-minimo*(255/(maximo-minimo)));
end
end
Finalmente sólo nos queda invertir los niveles de gris de la imagen resultante a fin de obtener el objeto de interés en negro sobre el fondo blanco. El siguiente código implementa todo el sistema haciendo uso de la función anteriormente descrita. Además, las siguientes figuras recogen algunos resultados obtenidos sobre ejemplos reales.
% FUNCIÓN PARA LA LIMPIEZA DE IMÁGENES RUIDOSAS
% Autor: Iván López Espejo
function y = Biolimp2(img,fon)
% Diferencia del fondo y la imagen.
img2 = fon - img;
% Stretching del resultado.
y2 = stretch(img2);
% Inversión del resultado y muestra por pantalla.
for j = 1:1:length(y2(:,1))
for k = 1:1:length(y2(1,:))
y(j,k) = 255 - y2(j,k);
end
end
subplot(2,1,1), imshow(img), title('Imagen original')
subplot(2,1,2), imshow(y), title('Imagen limpia')
img2 = fon - img;
% Stretching del resultado.
y2 = stretch(img2);
% Inversión del resultado y muestra por pantalla.
for j = 1:1:length(y2(:,1))
for k = 1:1:length(y2(1,:))
y(j,k) = 255 - y2(j,k);
end
end
subplot(2,1,1), imshow(img), title('Imagen original')
subplot(2,1,2), imshow(y), title('Imagen limpia')
Pueden existir muchas variantes del anterior método mucho más complejas como, por ejemplo, extraer estadísticamente algún parámetro de la imagen para delimitar el tipo de crecimiento (entre exponencial y logarítmico) de una función de stretching en forma de S, que “mejorase” el contraste entre el fondo y la muestra biomédica. No obstante, dado que el análisis final será personal y cualitativo, estas pequeñas diferencias no aportarán nada o prácticamente nada, por lo que pienso que es preferible una función sencilla y eficiente a algo más complejo que será desaprovechado finalmente por el ojo humano (en principio).



0 comentarios:
Publicar un comentario en la entrada