Tecnicas de Suavizado
Tecnicas de Suavizado
Tecnicas de Suavizado
Suavizado
if (array == NULL)
if (array == NULL)
return array;
}
float *Vector(int i0,int i1){
float *v ;
return v-i0 ;
}
int c, i;
char dummy[10000];
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’)
c = getc(fd);
}
i = 0;
while (1) {
i = (i*10) + (c - ‘0’);
c = getc(fd);
if (c==EOF) return (i);
if (c<’0’ || c>’9’) break;
}
return (i);
}
void Free(array, rows)
free(array[row]);
}
}
FILE *fd;
char header[100];
int tmp;
int x, y,c2, Contador=0;
unsigned char **Imagen;
if ((fd=fopen(filename,”rb”)) == NULL){
exit(0);
}
/* Leyendo el encabezado */
header[0]=fgetc(fd);
header[1]=fgetc(fd);
if(!(header[0]==’P’ && header[1]==’5’)){
fclose(fd);
exit(0);
}
*x_size = getint(fd);
*y_size = getint(fd);
tmp = getint(fd);
Imagen[x][y]=(unsigned char)fgetc(fd);
return 0;
}
fclose(fd);
return Imagen;
}
int pgmwrite(unsigned char **Imagen, char *filename, int Largo, int Alto){
FILE *Out;
int x, y, Contador=0;
if ((Out=fopen(filename,”wb”)) == NULL){
return 0;
}
fprintf(Out,”P5\n”);
fprintf(Out,”%d %d\n”, Largo, Alto);
fprintf(Out,”255\n”);
printf(“****************************************************”);
putc(Imagen[x][y], Out);
/* Verifico que se escriban todos los bytes */
if (Contador != (Largo*Alto)){
return 0;
}
fclose(Out);
2. Demo2.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include “PGM.c”
int Largo, Alto; /* Variables globales. Para que pasarlas
de funci�n a funci�n! */
int x, y;
Salida[x][y] = Original[x][y];
}
/* * * * * Obtiene el negativo de una imagen * * * * */
int x, y;
Salida[x][y] = 255-Original[x][y];
}
void Umbral(unsigned char **Original, unsigned char **Salida, int p){
int x, y;
int x, y;
int x, y;
for (x = 0; x < Largo; x++)
int x, y;
int x, y;
int x, y, p;
Salida[x][y] = 0;
Salida[x][y] = p1;
Salida[x][y] = p2;
Salida[x][y] = p3;
}else{
Salida[x][y] = p4;
}
}
void histograma(unsigned char **Original){
int x, y, p;
for (x = 0; x < Largo; x++){
printf(“{%d}”, Original[x][y]);
}
printf(“\n”);
}
}
int etiqueta = 1;
int etiquetas[MAX_ROWS * MAX_COLS] = {0}; // to keep track of labels
int filas = Largo;
int cols = Alto;
for (int i = 0; i < filas; i++) {
if (Original[i][j] == 255) {
Original[i][j] = etiqueta;
etiqueta++;
Original[i][j] = top;
Original[i][j] = left;
// ambos elementos, superior e izquierdo, han sido etiquetados con diferentes etiquetas
// fusionar etiquetas
Original[i][j] = min_label;
etiquetas[max_label] = min_label;
} else {
// ambos elementos superior e izquierdo han sido etiquetados con la misma etiqueta
Original[i][j] = top;
}
}
}
}
if (Original[i][j] > 0) {
Original[i][j] = min_label;
}
}
}
printf(“%d “, Original[i][j]);
}
printf(“\n”);
}
}
// Construcción de la submatriz
for (int k = 0; k < 3; k++) {
submatriz[k][l] = Original[i+k][j+l];
}
}
sum = 0;
for (int k = 0; k < 3; k++) {
sum += submatriz[k][l];
}
}
m++;
}
}
m=0;
Salida[i][j]=Original[i][j];//(int)promedios[m];
Salida[i+1][j]=Original[i+1][j];//(int)promedios[m];
Salida[i+2][j]=Original[i+2][j];//(int)promedios[m];
if(j < Alto)
Salida[i][j+1]=Original[i][j+1];//(int)promedios[m];
Salida[i+1][j+1]=(int)promedios[m];
Salida[i+2][j+1]=Original[i+2][j+1];//(int)promedios[m];
Salida[i][j+2]=Original[i][j+2];//(int)promedios[m];
Salida[i+1][j+2]=Original[i+1][j+2];//(int)promedios[m];
Salida[i+2][j+2]=Original[i+2][j+2];//(int)promedios[m];
m++;
}
}
int menu(){
int op;
printf(“\t.:Menu:.\n”);
/* * * * * * * * * * * * * * * * * * * */
int main(int argc, char *argv[]){
int c;
int p, p1, p2, p3, p4;
system(“clear”);
switch (menu()){
case -1:
exit(1);
break;
case 1:
Copia(Original, Salida);
break;
case 2:
Inverso(Original, Salida);
break;
case 3:
scanf(“%d”,&p);
break;
case 4:
scanf(“%d”,&p1);
scanf(“%d”,&p2);
break;
case 5:
scanf(“%d”,&p1);
scanf(“%d”,&p2);
break;
case 6:
scanf(“%d”,&p1);
scanf(“%d”,&p2);
break;
case 7:
scanf(“%d”,&p1);
scanf(“%d”,&p1);
scanf(“%d”,&p2);
break;
case 9:
scanf(“%d”,&p1);
scanf(“%d”,&p2);
scanf(“%d”,&p3);
scanf(“%d”,&p4);
break;
case 10:
histograma(Original);
break;
case 11:
etiquetas(Original);
break;
case 12:
suavizado(Original,Salida);
break;
default:
break;
}
exit(0);
}
3. convulsión 2D
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread(‘xd.jpg’)
#Crea el kernel
kernel = np.ones((5,5),np.float32)/25
dst = cv2.filter2D(img,-1,kernel)
plt.xticks([]), plt.yticks([])
plt.show()
4. Difuminado de imágenes
a. Promedio
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread(‘xd.jpg’)
blur = cv2.blur(img,(3,3))
plt.xticks([]), plt.yticks([])
plt.show()
b. Gaussiano
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread(‘xd.jpg’)
plt.xticks([]), plt.yticks([])
plt.show()
c. Mediana
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread(‘xd.jpg’)
median = cv2.medianBlur(img,5)
plt.xticks([]), plt.yticks([])
plt.show()
Capturas de pantalla
1. Codigo en C
2. códigos en Python
La función cv2.filter2D(), disponible en OpenCV, permite aplicar una convolución entre un
kernel dado y una imagen
1. Filtro de Mediana
Este filtro calcula la mediana de todos los píxeles bajo la ventana del kernel y el píxel
central se reemplaza con este valor mediano. Esto es muy efectivo para eliminar el
ruido conocido como ruido de sal y pimienta. OpenCV dispone de la función
cv2.medianBlur() para aplicar este tipo de filtro a una imagen. Al igual que en el filtro
Gaussiano, el tamaño del kernel en el filtro de mediana tiene que ser un número
entero impar positivo.
Referencias
http://mmartin.cs.buap.mx/notas/PDI-MM-Rev.2013.pdf
https://unipython.com/suavizando-imagenes-con-opencv/
Video
https://youtu.be/TgvJEEyLBeo