¿Por qué Sobel operator se ve así?


Para el cálculo derivado de la imagen, el operador Sobel se ve de esta manera:

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

No entiendo bien 2 cosas al respecto,

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

[-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. Ayúdame, por favor.

Author: bjou, 2013-06-13

3 answers

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

De hecho, el operador de gradiente más simple en el que podríamos pensar es aún más simple que el que sugiere anteriormente:{[19]]}

[-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) será claramente le dará un degradado 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.

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án el posible ruido:

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

Pero esta tiende a promediar las cosas un poco demasiado: cuando se aplica a una fila específica, perdemos mucho de lo que hace que el detalle de esta fila específica. Para arreglar eso, queremos darle un poco más de peso a la fila central, lo que nos permitirá deshacernos del 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 a Sobel filtro:

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

La manipulación de los coeficientes puede conducir a otros operadores de gradiente como el operador Scharr, que da solo un poco más 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 está en mi opinión en el corazón de la visión por computadora. Solo su imaginación es el límite para crear nuevos, siempre y cuando se adapte a sus necesidades...

 50
Author: mbrenon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-09 14:09:52

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

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

En primer lugar, en la visión por computadora, el " Más a menudo, solo intentamos un el enfoque del operador solo pierde tiempo y da resultados pobres en comparación con lo que se podría haber logrado. (Dicho esto, también me gusta experimentar.)

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

[1 2 1] se utiliza para filtrar el ruido como mbrenon, manifestó. La razón por la que estos números en particular 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 coincidencia). Ahora, si desea reducir el ruido y está encontrando una derivada horizontal, desea filtrar en la dirección vertical para afectar menos a la estimación derivada. Convolving 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]
 15
Author: Bull,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-19 04:06:39

Para una imagen 2D necesita una máscara. Digamos que esta máscara es:

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

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

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

Ahora bien, si queremos restar la señal delante del píxel medio (eso es lo que es la diferenciación en la resta discreta) 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 tener una imagen suave (por ejemplo, todos los 255s) queremos tener una respuesta cero, es decir, obtenemos:

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

En el caso de una imagen suave, 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 normalizamos obtenemos:

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

Y puedes establecer A a cualquier cosa que quieras experimentalmente. Un factor de 2 da el filtro Sobel original.

 2
Author: staonas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-27 08:20:38