prewitt paso operador mascara marr laplaciano laplaciana imagen hildreth filtro deteccion canny bordes alto algoritmo image-processing computer-vision edge-detection

image processing - paso - ¿Por qué el operador Sobel se ve de esa manera?



mascara laplaciana (3)

Para el cálculo de derivadas de imágenes, el operador de Sobel se ve de esta manera:

[-1 0 1] [-2 0 2] [-1 0 1]

No entiendo muy bien 2 cosas al respecto,

1. ¿Por qué el píxel central es 0 ? ¿No puedo usar un operador como a continuación,

[-1 1] [-1 1] [-1 1]

2. ¿Por qué la fila central es 2 veces las otras filas?

Busqué en Google mis preguntas, no encontré ninguna respuesta que pueda convencerme. Por favor, ayúdame.


EDITAR La verdadera razón por la que el operador de Sobel se ve de esa manera se puede encontrar leyendo un artículo interesante del propio Sobel . Mi lectura rápida de este artículo indica que la idea de Sobel era obtener una estimación mejorada del gradiente promediando las diferencias centrales horizontales, verticales y diagonales. Ahora, cuando divide el degradado en componentes verticales y horizontales, las diferencias diagonales centrales se incluyen en ambos, mientras que las diferencias centrales verticales y horizontales solo se incluyen en una. Dos evitan el doble conteo de las diagonales, por lo tanto, deben tener la mitad de los pesos de la vertical y la horizontal. Los pesos reales de 1 y 2 son convenientes para la aritmética de punto fijo (y en realidad incluyen un factor de escala de 16).

Estoy de acuerdo con @mbrenon sobre todo, pero hay un par de puntos demasiado difíciles de hacer en un comentario.

En primer lugar, en la visión artificial, el enfoque "La mayoría de las veces, solo probamos un operador" solo desperdicia tiempo y arroja resultados pobres en comparación con lo que se podría haber logrado. (Dicho esto, me gusta experimentar también).

Es cierto que una buena razón para usar [-1 0 1] es que centra la estimación derivativa en el píxel. Pero otra buena razón es que es la fórmula de la diferencia central , y puede demostrar matemáticamente que da un error menor en su estimación de la derivada verdadera que [-1 1].

[1 2 1] se usa para filtrar ruido como mbrenon, dijo. La razón por la que estos números particulares funcionan bien es que son una aproximación de un gaussiano que es el único filtro que no introduce artefactos (aunque del artículo de Sobel, esto parece ser una coincidencia). Ahora bien, si desea reducir el ruido y encuentra una derivada horizontal, quiere filtrar en la dirección vertical para afectar al menos la estimación derivada. Convolviendo la transpose([1 2 1]) con [-1 0 1] obtenemos el operador Sobel. es decir:

[1] [-1 0 1] [2]*[-1 0 1] = [-2 0 2] [1] [-1 0 1]


En la visión por computadora, a menudo no hay una forma perfecta y universal de hacer algo. Muy a menudo, solo probamos un operador, vemos sus resultados y verificamos si se ajustan a nuestras necesidades. También es cierto para el cálculo del gradiente: el operador Sobel es una de las muchas formas de calcular un gradiente de imagen, que ha demostrado su utilidad en muchos usos.

De hecho, el operador de gradiente más simple que podríamos pensar es incluso más simple que el que sugiere arriba:

[-1 1]

A pesar de su simplicidad, este operador tiene un primer problema: cuando lo usa, calcula el gradiente entre dos posiciones y no en una posición. Si lo aplica a 2 píxeles (x,y) y (x+1,y) , ¿ha calculado el gradiente en la posición (x,y) o (x+1,y) ? De hecho, lo que ha calculado es el gradiente en la posición (x+0.5,y) , y trabajar con medio píxel no es muy útil. Es por eso que agregamos un cero en el medio:

[-1 0 1]

Aplicando este a los píxeles (x-1,y) , (x,y) y (x+1,y) claramente le dará un gradiente para el píxel central (x,y) .

Este también se puede ver como la convolución de dos filtros [-1 1] : [-1 1 0] que calcula el gradiente en la posición (x-0.5,y) , a la izquierda del píxel, y [0 -1 1] que calcula el gradiente a la derecha del píxel.

Ahora este filtro todavía tiene otra desventaja: es muy sensible al ruido. Es por eso que decidimos no aplicarlo en una sola fila de píxeles, sino en 3 filas: esto permite obtener un degradado promedio en estas 3 filas, que suavizará el posible ruido:

[-1 0 1] [-1 0 1] [-1 0 1]

Pero este tiende a promediar demasiado las cosas: cuando se aplica a una fila específica, perdemos gran parte de lo que compone los detalles de esta fila específica. Para solucionarlo, queremos dar un poco más de peso a la fila central, lo que nos permitirá eliminar el posible ruido teniendo en cuenta lo que sucede en las filas anterior y siguiente, pero manteniendo la especificidad de esa misma fila. Eso es lo que le da el filtro Sobel:

[-1 0 1] [-2 0 2] [-1 0 1]

Alterar los coeficientes puede conducir a otros operadores de degradado, como el operador Scharr, que da un poco más de peso a la fila central:

[-3 0 3 ] [-10 0 10] [-3 0 3 ]

También hay razones matemáticas para esto, como la separabilidad de estos filtros ... pero prefiero verlo como un descubrimiento experimental que demostró tener propiedades matemáticas interesantes, ya que el experimento es en mi opinión el núcleo de la visión por computadora. Solo tu imaginación es el límite para crear nuevas, siempre que se adapte a tus necesidades ...


Para una imagen 2D necesitas una máscara. Diga que esta máscara es:

[ a11 a12 a13; a21 a22 a23; a31 a32 a33 ]

Df_x (gradiente a lo largo de x) debe producirse desde Df_y (gradiente a lo largo de y) mediante una rotación de 90o, es decir, la máscara debe ser:

[ a11 a12 a11; a21 a22 a21; a31 a32 a31 ]

Ahora, si queremos restar la señal en frente del píxel del medio (eso es lo que diferencia en discreto - resta) queremos asignar los mismos pesos a ambos lados de la resta, es decir, nuestra máscara se convierte en:

[ a11 a12 a11; a21 a22 a21; -a11 -a12 -a11 ]

A continuación, la suma del peso debe ser cero, porque cuando tenemos una imagen suave (por ejemplo, todos los 255) queremos tener una respuesta cero, es decir, obtenemos:

[ a11 a12 a11; a21 -2a21 a21; -a31 -a12 -a31 ]

En el caso de una imagen uniforme, esperamos que la diferenciación a lo largo del eje X produzca cero, es decir:

[ a11 a12 a11; 0 0 0; -a31 -a12 -a31 ]

Finalmente, si nos normalizamos, obtenemos:

[ 1 A 1; 0 0 0; -1 -A -1 ]

y puedes configurar A para cualquier cosa que desees experimentalmente. Un factor de 2 proporciona el filtro Sobel original.