viernes, 5 de diciembre de 2008

PROCESAMIENTO DE IMÁGENES

En la parte visual, tenemos lo que es procesamiento de imágenes, son un conjunto de algoritmos que tienen como fin modificar, ya sea para bien o para mal, una imagen dada.

Pueden darse 3 tipos de procesamientos:
• Por puntos : se va procesando la imagen píxel por píxel.
• Local : se procesa por regiones, llamadas operaciones de vecindad ya que se utiliza un píxel y sus valores cercanos.
• Global : como su mismo nombre lo dice, el procesamiento de imágenes es global, es decir la imagen completa.

Se implementaron varios algoritmos de procesamiento de imágenes, entre ellos :

1. Diversos Filtros ( Gaussiano, promedio, realce, etc) : tienen como fin acentuar o disminuir una determinada característica de la imagen a procesar. Se usa la convolusión para esto, consiste en multiplicar la matriz de píxeles de la imagen por una máscara dada, para los cambios que se requieran.
2. Umbrales : el nivel de transición de grises se da por un valor dado que dividirá al mismo.
3. Inversa o negación : para simplemente cambiar los bits de blanco a negro y de negro a blanco, volviendo a la imagen negativa.
4. Binarización : tiene como objetivo principal diferenciar el objeto,persona,etc de la imagen del fondo de esta.


Veremos aquí los más importanes.

3.1 Negación :
Siendo img la imagen :

I=imread(img);
I=double(I);
[f,c]=size(I);
NI=255-I;
imshow(uint8(I))
pause;
imshow (uint8(NI));

Simplemente obtenemos el complemento a 255 de cada uno de los píxeles.

3.2 Binarización:

I=imread(imagen);
I=double(I);
[n,m]=size(I);

for i=1:n
for j=1:m
if I(i,j) IN(i,j)=0;
else
IN(i,j)=255;
end
end
end

imshow(uint8(I))
pause;
imshow(uint8(IN))

Se especifica un parámetro, desde el cual los valores menores a él se harán negros y los otros blancos.

3.3 Valor Umbral:

%leyendo imagen
I=imread(imagen);

I=double(I); %convirtiendo enteros a dobles
[n,m]=size(I); %calcular el tamaño

for i=1:n %para el eje Y es decir filas
for j=1:m %para el eje X es decir columnas
if (I(i,j)<=param)
IN(i,j)=255;
else
IN(i,j)=0;
end

end

end
imshow(uint8(I))
pause;
imshow(uint8(IN))

Da tonos de grises a partir de un valor ingresado como parámetro.

3.4 Umbral Intervalo:

%leyendo imagen
I=imread(imagen);

I=double(I); %convirtiendo enteros a dobles
IO=I;
[n,m]=size(I); %calcular el tamaño

for i=1:n %para el eje Y es decir filas
for j=1:m %para el eje X es decir columnas
%u1=50 u2=190
if (I(i,j)<=param1 | I(i,j)>=param2)
I(i,j)=255;
else
if(param1 IN(i,j)=I(i,j);
end
end

end

end
imshow(uint8(IO))
pause;
imshow(uint8(IN))

Es el mismo que el anterior, pero esta vez dado por un intervalo de 2 valores, al modificarse estos se obtendrán resultados muy diferentes.

3.5 Filtro Gaussiano

img=imread(imagen);
img=double(img);
[m,n]=size(img);
p=0;
mascara=[1,2,1 ; 2,4,2 ; 1,2,1];
for i=2:m-1
for j=2:n-1
for h=1:3
for k=1:3
p = p + img(i+h-2,j+k-2)* mascara(h,k);
end
end
img2(i,j) = p/16;
p=0;
end
end
imshow(uint8(img))
pause;
imshow(uint8(img2))

Aquí empezamos ya a usar operaciones d vecindad o locales, en este caso usamos una máscara y la comparamos con puntos específicos de la imagen.

Al cambiar la máscara se obtienen varios resultados, como por ejemplo :

3.6 Filtro Mediana:
img=imread(imagen);
img=double(img);
[m,n]=size(img);
p=0;
for i=2:m-1
for j=2:n-1
g=0;
for h=1:3
for k=1:3
g=g+1;
v(g)=img(i+h-2,j+k-2);%guardo los valores en un arreglo
end
end

%ordeno el arreglo "v"
for vi=1:9
for vj=1:9
if v(vi) > v(vj)
temp=v(vi);
v(vi)=v(vj);
v(vj)=temp;
end

end
end
img2(i,j) = v(5);%el pixel tendra el valor de la mediana
end
end
imshow(uint8(img))
pause;
imshow(uint8(img2))

3.7 Filtro Promedio:
img=imread(imagen);
img=double(img);
[m,n]=size(img);
p=0;
mascara=[1,1,1 ; 1,1,1 ; 1,1,1];
for i=2:m-1
for j=2:n-1
for h=1:3
for k=1:3
p = p + img(i+h-2,j+k-2)* mascara(h,k);
end
end
img2(i,j) = p/9;
p=0;
end
end
imshow(uint8(img))
pause;
imshow(uint8(img2))


3.8 Filtro Promedio Rango:

img=imread(imagen);
img=double(img);
[m,n]=size(img);
p=0;
mascara=[1,1,1 ; 1,1,1 ; 1,1,1];
for i=2:m-1
for j=2:n-1

for h=1:3

for k=1:3

if img(i+h-2,j+k-2) > 60 & img(i+h-2,j+k-2) < 250
p = p + img(i+h-2,j+k-2) * mascara(h,k);

end
end
end
img2(i,j) = p/9;
p=0;
end
end

imshow(uint8(img))
pause;
imshow(uint8(img2))


3.9 Filtro Realce:

img=imread(imagen);
img=double(img);
[m,n]=size(img);
p=0;
mascara=[-1/8,-1/8,-1/8 ; -1/8,1,-1/8 ; -1/8,-1/8,-1/8];
for i=2:m-1
for j=2:n-1
for h=1:3
for k=1:3
p = p + img(i+h-2,j+k-2)* mascara(h,k);
end
end
img2(i,j) = p;
p=0;
end
end
imshow(uint8(img))
pause;
imshow(uint8(img2))


3.10 Extensión:

img=imread(imagen);
img=double(img);
[m,n]=size(img);
for i=1:m
for j=1:n
img2(i,j)=(img(i,j)-u1)*255/(u2-u1);

end
end
imshow(uint8(img))
pause;
imshow(uint8(img2))


3.11 Histograma:

img=imread(imagen);
img=double(img);
[m,n]=size(img);
histograma=zeros(1,256);
for i=1:m
for j=1:n
histograma(img(i,j)+1)= histograma(img(i,j)+1) + 1;
end
end
plot(histograma);

Muestra el nivel de color o de gris de cada pixel de la imagen en un gráfico de barras o de ondas. Al ampliarlo se puede modificar el contraste:

img=imread(handles.direccion);
a=str2double(get(handles.txtExpHistA,'string'));
b=str2double(get(handles.txtExpHistB,'string'));
img=double(img);
[m,n]=size(img);
for i=1:m
for j=1:n
img(i,j)=(img(i,j)*(b-a)/255)+a;

end
end
axes(handles.Procesada);
image(uint8(img))


También se pueden hacer operaciones con 2 imágenes como sumar y restar:

3.12 Suma :

imagen1=imread(ima);
imagen2=imread(ima2);
imagen1=double(imagen1);
imagen2=double(imagen2);
[X,Y,Z]=size(imagen1);
for i=1:X
for j=1:Y
for k=1:Z
imagen3(i,j,k) = ((imagen1(i,j,k) + imagen2(i,j,k))/2);
end
end
end

imshow(uint8(imagen1));
pause;
imshow(uint8(imagen2));
pause;
imshow(uint8(imagen3));

3.13 Resta :

imagen1=imread(ima);
imagen2=imread(ima2);
imagen1=double(imagen1);
imagen2=double(imagen2);
[X,Y]=size(imagen1);
for i=1:X
for j=1:Y
imagen3(i,j)=(imagen1(i,j)-imagen2(i,j))*2;
end
end
imshow(uint8(imagen1));
pause;
imshow(uint8(imagen2));
pause;
imshow(uint8(imagen3));

No hay comentarios: