Operador Prewitt y Roberts
Operador Prewitt y Roberts
Operador Prewitt y Roberts
Prewitt y
Roberts
}
/* * * * * Obtiene el negativo de una imagen * * * * */
void Inverso(unsigned char **Original, unsigned char **Salida){
int x, y;
}
void Umbral(unsigned char **Original, unsigned char **Salida, int p){
int x, y;
int sum = 0;
// Construcción de la submatriz
for (int k = 0; k < 3; k++) {
for (int l = 0; l < 3; l++) {
z[k][l] = Original[i+k][j+l];
}
}
int sum = 0;
// Construcción de la submatriz
for (int k = 0; k < 3; k++) {
for (int l = 0; l < 3; l++) {
z[k][l] = Original[i+k][j+l];
}
}
Salida[i+1][j+1] = (z[2][0] + 2*z[2][1] + z[2][2]) - (z[0][1] +
2*z[0][2] + z[0][3]);
// Construcción de la submatriz
for (int k = 0; k < 3; k++) {
for (int l = 0; l < 3; l++) {
z[k][l] = Original[i+k][j+l];
}
}
gx = (z[0][2] + 2*z[1][2] + z[2][2]) - (z[0][0] + 2*z[1][0] +
z[2][0]);
gy = (z[2][0] + 2*z[2][1] + z[2][2]) - (z[0][1] + 2*z[0][2] +
z[0][3]);
Salida[i+1][j+1] = abs(gx) + abs(gy);
/* * * * * * * * * * * * * * * * * * * */
int main(int argc, char *argv[]){
unsigned char **Original = (unsigned char **)pgmread(argv[1],
&Largo, &Alto);
unsigned char **Salida = (unsigned char **)Matriz(Largo, Alto,
sizeof(unsigned char));
unsigned char **Salida2 = (unsigned char **)Matriz(Largo+2, Alto+1,
sizeof(unsigned char));
int c;
int p, p1, p2, p3, p4;
system("clear");
switch (menu()){
case -1:
exit(1);
break;
case 1:
printf(" Salida->Copia de la imagen \n \n");
Copia(Original, Salida);
break;
case 2:
printf(" Salida->inverso de la imagen \n \n");
Inverso(Original, Salida);
break;
case 3:
printf("Escriba el valor de p: ");
scanf("%d",&p);
printf(" Salida->umbral de la imagen \n \n");
Umbral(Original, Salida, p);
break;
case 4:
printf("Escriba el valor de p1: ");
scanf("%d",&p1);
printf("Escriba el valor de p2: ");
scanf("%d",&p2);
printf(" Salida->umbral binario de la imagen \n \n");
IntervaloUmbralBinario(Original, Salida, p1,p2);
break;
case 5:
printf("Escriba el valor de p1: ");
scanf("%d",&p1);
printf("Escriba el valor de p2: ");
scanf("%d",&p2);
printf(" Salida->umbral invertido de la imagen \n \n");
IntervaloUmbralBinarioInvertido(Original, Salida, p1,p2);
break;
case 6:
printf("Escriba el valor de p1: ");
scanf("%d",&p1);
printf("Escriba el valor de p2: ");
scanf("%d",&p2);
printf(" Salida->umbral escala de grises de la imagen \n
\n");
IntervaloUmbralGrises(Original, Salida, p1, p2);
break;
case 7:
printf("Escriba el valor de p1: ");
scanf("%d",&p1);
printf("Escriba el valor de p2: ");
scanf("%d",&p2);
printf(" Salida->umbral escala de grises invertido de la
imagen \n \n");
IntervaloUmbralGrisesInvertido(Original, Salida, p1, p2);
break;
case 8:
printf("Escriba el valor de p1: ");
scanf("%d",&p1);
printf("Escriba el valor de p2: ");
scanf("%d",&p2);
printf(" Salida->extension de la imagen \n \n");
Extension(Original, Salida, p1, p2);
break;
case 9:
printf("Escriba el valor de p1: ");
scanf("%d",&p1);
printf("Escriba el valor de p2: ");
scanf("%d",&p2);
printf("Escriba el valor de p3: ");
scanf("%d",&p3);
printf("Escriba el valor de p4: ");
scanf("%d",&p4);
printf(" Salida->reduccion de nivel de gris de la imagen
\n \n");
ReduccionNivelGris(Original, Salida, p1, p2, p3, p4);
break;
case 10:
printf(" Salida->histograma de la imagen \n \n");
histograma(Original);
break;
case 11:
printf(" Salida->matriz xD \n \n");
etiquetas(Original);
break;
case 12:
printf(" Salida->suavizado de imagen");
suavizado(Original,Salida);
break;
case 13:
printf(" Salida->bordes de imagen");
gx(Original,Salida);
pgmwrite(Salida, "gx.pgm", Largo, Alto);
gy(Original,Salida);
pgmwrite(Salida, "gy.pgm", Largo, Alto);
g(Original,Salida);
pgmwrite(Salida, "g.pgm", Largo, Alto);
break;
case 14:
printf(" Salida->operador prewitt");
prewitt(Original,Salida);
break;
case 15:
printf(" Salida->operador de roberts");
roberts(Original,Salida);
break;
default:
printf("Ups... algo salio mal");
break;
}
pgmwrite(Salida, "imagen.pgm", Largo, Alto);
exit(0);
}
2. PGM
#include <stdlib.h>
#include <stdio.h>
/* Funciones:
float **Imagen = pgmread("imagen.pgm", &Largo, &Alto);
if (array == NULL)
printf("Error al asignar lineas a la matriz\n"), exit(0);
return array;
}
c = getc(fd);
while (1) /* find next integer */
{
if (c=='#') /* Descartar los comentarios */
fgets(dummy,9000,fd);
if (c==EOF){
return 0;
}
if (c>='0' && c<='9')
break; /* found what we were looking for */
c = getc(fd);
}
return (i);
}
if ((fd=fopen(filename,"rb")) == NULL){
printf("No puedo abrir %s para lectura!\n", filename);
exit(0);
}
/* Leyendo el encabezado */
header[0]=fgetc(fd);
header[1]=fgetc(fd);
if(!(header[0]=='P' && header[1]=='5')){
printf("Error al leer el archivo\nLa imagen %s no es un
PGM!\n",filename);
fclose(fd);
exit(0);
}
*x_size = getint(fd);
*y_size = getint(fd);
tmp = getint(fd);
fclose(fd);
printf("Cargando imagen %s\n", filename);
return Imagen;
}
if ((Out=fopen(filename,"wb")) == NULL){
printf("No puedo escribir la imagen!\n");
return 0;
}
fclose(Out);
3. Prewitt
import cv2
# Cargar la imagen
img = cv2.imread("h.jpg")
4. Roberts
import cv2
import numpy as np
# Leer la imagen
img = cv2.imread("xd.jpg")
# Calcular la magnitud
magnitude = cv2.magnitude(robertsx.astype(np.float32),
robertsy.astype(np.float32))
Capturas de pantalla
1. Programas en C
PREWITT
ROBERTS
2. Programas en Python
PREWITT
ROBERTS
Referencias
http://mmartin.cs.buap.mx/notas/PDI-MM-Rev.2013.pdf
https://pythoneyes.wordpress.com/2017/07/28/filtros-para-la-deteccion-de-bordes-de-una-
imagen-con-python-3-parte-2/
https://www.boletin.upiita.ipn.mx/index.php/ciencia/669-cyt-numero-55/1293-extraccion-de-
bordes-operadores-sobel-prewitt-y-roberts
https://programmerclick.com/article/4091430424/
https://www.researchgate.net/profile/Noureddine-
Alaa/publication/349811111_Image_Processing_with_Python_An_Introduction/links/604213a4a6
fdcc9c78124c67/Image-Processing-with-Python-An-Introduction.pdf pag 62-66 recomendado
Video
https://youtu.be/ZhWV7hRbbMw