transformada hough circles opencv edge-detection hough-transform

circles - ¿De qué sirve Canny antes de HoughLines(opencv)?



hough transform opencv python (4)

Teóricamente, tienes razón. Encontrar bordes no es absolutamente necesario para que el algoritmo de Hough Line funcione.

La forma en que funciona el Hough es básicamente toma cada punto y lo conecta con cualquier otro punto, y los puntos que tengan la mayor cantidad de líneas que los atraviesan, esas líneas permanecen. Para esto, necesitamos puntos. The Canny crea esos puntos. Teóricamente, podría usar cualquier tipo de filtro, aislar todos los puntos azules o morados y conectarlos, lo que sea, pero los bordes funcionan bien.

El Hough tampoco pesa sus líneas o puntos. Para Hough, una imagen es binaria, compuesta de 1 o de 0, puntos o no puntos. No hay necesidad de escala de grises y el astuto devuelve convenientemente imágenes binarias.

Así es que Canny siempre es parte de Hough.

Soy nuevo en el procesamiento de imágenes y estoy trabajando para detectar líneas en una imagen de documento. Leí la teoría de la transformación de línea Hough, pero no veo por qué debo usar Canny antes de llamar a esa función en opencv como se dice en muchos tutoriales. ¿De qué sirve encontrar bordes en este caso? El hecho es que si no uso Canny o umbral antes de HoughLines () los resultados serán muy desordenados. Espero que alguien me explique por qué.

2 de los tutoriales que he leído:

  1. Detección de la función Imgproc
  2. Hough Line Transform

todo se trata de procesar datos binarios,

datos complejos -> (datos binarios, b datos binarios, c datos binarios, ...) (usando canny (), sobel (), etc.)

a datos binarios -> function1 () (usando houghlines ())

b datos binarios -> función2 ()

c datos binarios -> función3 () ..

un dato binario -X-> function2 () ..

datos complejos -X-> function1 () ..

HTH


Respuesta corta

cvCanny se usa para detectar bordes, así como para aumentar el contraste y eliminar el ruido de la imagen. HoughLines que usa la Transformada Hough se usa para determinar si esos bordes son líneas o no. Hough Transform requiere que los bordes se detecten bien para ser eficientes y proporcionar resultados significativos.

Respuesta larga

Las limitaciones de Hough Transform se describen con más detalle en Wikipedia.

La eficiencia de la Transformada Hough depende de que el cubo del píxel aculado sea distinto, por ejemplo, un contraste directo entre un píxel y sus vecinos circundantes o si se usa una región de máscara una región de píxel y sus regiones circundantes. Si todos los píxeles tuvieran valores similares aculados, nada se destacaría como una línea o un círculo. Esto lleva a la reducción del color (color a escala de grises, escala de grises a blanco y negro) para aumentar el contrato.

El número de parámetros de Hough Transform también aumenta la dispersión de votos en los contenedores de píxeles y aumenta la complejidad de la transformación, lo que significa que normalmente solo las líneas o círculos se detectan con fiabilidad ya que tienen menos de 3 parámetros.

Los bordes deben detectarse bien antes de ejecutar la Transformada Hough; de lo contrario, su eficacia sufrirá aún más. Además, las imágenes ruidosas no funcionan bien con la transformada Hough a menos que el ruido se elimine antes de la mano.


En primer lugar, para detectar las líneas que necesita para trabajar en una imagen de matriz boolean (o binaria), quiero decir: el color es negro o blanco , no hay escala de grises .

El requisito de HoughLines() para funcionar correctamente es tener este tipo de imagen como entrada. Esa es la razón por la que tiene que usar Canny o Treshold para convertir la matriz de imagen coloreada en una booleana .

Transformación Hough

Una línea en una imagen es en realidad una ventaja. La transformada Hough escanea toda la imagen y utiliza una transformación que convierte todas las coordenadas cartesianas de píxeles blancos en coordenadas polares; los píxeles negros quedan fuera. Por lo tanto, no podrá obtener una línea si primero no detecta los bordes, porque HoughLines() no sabe cómo comportarse cuando hay una escala de grises.