Implementar el algoritmo de retroproyección del histograma en OpenCV

Implement Histogram Back Projection Algorithm Opencv

Objetivo: comprender el algoritmo de proyección de histograma bidimensional

teoría



El algoritmo de este artículo se deriva del artículo 'Indexación a través de histogramas de color' escrito por Michael J. Swain y Dana H. Ballard. El artículo se divide en dos partes. La primera parte describe en detalle el histograma de color y la cruz de histogramas de color para lograr la identificación del objeto. Puede realizar la distinción de fondo de objetos, encontrar objetos en escenas complejas, influencia de diferentes condiciones de iluminación, etc. Este método puede mantener la estabilidad para la transformación de píxeles de fondo y también tiene un cierto efecto antiinterferente en la transformación de escala, pero no puede características de la invariancia de escala. Con base en la teoría anterior, los dos autores encontraron que este método puede localizar la posición de un objeto conocido en la imagen. A este método lo llaman histograma retroproyección (retroproyección). ( https://wenku.baidu.com/view/c5613bfa770bf78a65295443.html El artículo se puede ver aquí)



El artículo es muy largo, ¿se puede resumir en una o dos frases simples? Este algoritmo se utiliza principalmente para la segmentación de imágenes o la búsqueda de objetos de destino. En pocas palabras, la imagen que crea tiene el mismo tamaño que la imagen de entrada (pero solo tiene un canal), y cada píxel corresponde a la probabilidad de que el píxel pertenezca al objeto que se debe buscar. Para decirlo de manera más simple, el objeto en la parte de la imagen de salida de interés es más blanco que la parte restante. Bueno, esta es una explicación intuitiva. La retroproyección del histograma se utiliza en combinación con el algoritmo camshift (Camshift es una mejora del algoritmo MeanShift, llamado algoritmo MeanShift adaptativo continuo).



¿Cómo implementar este algoritmo? Primero cree un histograma de imagen que contenga el objetivo de búsqueda y luego cree el histograma de imagen del objetivo de búsqueda. Por supuesto, aquí se utiliza un histograma de color bidimensional, porque es más fácil definir el objeto de destino que un histograma en escala de grises. Finalmente, el método de proyección se utiliza para calcular los dos histogramas, es decir, se calcula la probabilidad de cada píxel en la imagen de destino y finalmente se establece un umbral para separar.

Lo siguiente utiliza numerosas funciones relacionadas para implementar este algoritmo:

El primer paso es encontrar el histograma bidimensional del objeto de destino, llamado M



Calcule el histograma de la imagen buscada, llamado I.

El segundo paso es calcular R = M / I para obtener la matriz R de proyección, y luego usar la matriz R para indexar para crear una nueva imagen B, B (x, y) = R [h (x, y), s (x, y)], donde h es el tono y s es la saturación. Finalmente, se calcula mediante la condición B (x, y) = min [B (x, y), 1].

El tercer paso es calcular una convolución elíptica: B = D ∗ B, D es el núcleo de convolución elíptica.

El cuarto paso es la segmentación del umbral.

El siguiente ejemplo se puede utilizar para ilustrar el proceso:

|_+_|

El resultado de salida es el siguiente:

Ingrese la imagen buscada

Imagen de salida

Busquemos el algoritmo implementado en OpenCV. Los ejemplos son los siguientes:

|_+_|

El resultado de salida es el siguiente:

https://blog.csdn.net/caimouse/article/details/51749579