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)
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:
Publicar un comentario