ruido mediana gaussiano filtros filtro python opencv image-processing

mediana - filtros opencv python



¿Cómo encontrar una plantilla en una imagen usando una máscara(o transparencia) con OpenCV y Python? (5)

Supongamos que estamos buscando esta plantilla:

Detener http://oi48.tinypic.com/2u7q1l4.jpg

Las esquinas de nuestra plantilla son transparentes, por lo que el fondo variará, así:

Parada en la luna http://i49.tinypic.com/ziw3mc.png

Parar en everest http://i45.tinypic.com/2unwxhu.png

Parar en las hojas http://i48.tinypic.com/t06v7k.png

Asumiendo que podríamos usar la siguiente máscara con nuestra plantilla:

Detener http://oi48.tinypic.com/2u7q1l4.jpg Stop mask http://i49.tinypic.com/ogclfd.png

Sería muy fácil encontrarlo.

Lo que he intentado:

He intentado con matchTemplate pero no admite máscaras (hasta donde sé), y el uso del canal alfa (transparencia) en la plantilla no lo consigue, ya que compara los canales alfa en lugar de ignorar esos píxeles.

También busqué en "región de interés", que pensé que sería la solución, pero con ella solo se puede especificar un área rectangular. Ni siquiera estoy seguro de si funciona en la plantilla o no.

Estoy seguro de que esto es posible escribiendo mi propio algoritmo, pero esperaba que esto sea posible a través de. OpenCV estándar para evitar reinventar la rueda. Sin mencionar, probablemente sería más optimizado que el mío.

Entonces, ¿cómo podría hacer algo como esto con OpenCV + Python?


Esto podría lograrse utilizando solo la función matchTemplate , pero se necesita una pequeña solución.

Permite analizar las métricas predeterminadas ( CV_TM_SQDIFF_NORMED ). De acuerdo con la documentación de MatchTemplate, las métricas predeterminadas se ven así

R(x, y) = sum (I(x+x'', y+y'') - T(x'', y''))^2

Donde I es la matriz de la imagen, T es la plantilla, R es la matriz de resultados. La suma se realiza sobre las coordenadas de la plantilla x'' e y'' ,

Entonces, modifiquemos esta métrica insertando la matriz de peso W , que tiene las mismas dimensiones que T

Q(x, y) = sum W(x'', y'')*(I(x+x'', y+y'') - T(x'', y''))^2

En este caso, al establecer W(x'', y'') = 0 , puede hacer que se ignore el píxel. Entonces, ¿cómo hacer tales métricas? Con matemáticas simples:

Q(x, y) = sum W(x'', y'')*(I(x+x'', y+y'') - T(x'', y''))^2 = sum W(x'', y'')*(I(x+x'', y+y'')^2 - 2*I(x+x'', y+y'')*T(x'', y'') + T(x'', y'')^2) = sum {W(x'', y'')*I(x+x'', y+y'')^2} - sum{W(x'', y'')*2*I(x+x'', y+y'')*T(x'', y'')} + sum{W(x'', y'')*T(x'', y'')^2)}

Entonces, dividimos las métricas de Q en sumas separadas de árbol. Y todas esas sumas se pueden calcular con la función matchTemplate (usando el método CV_TM_CCORR ). A saber

sum {W(x'', y'')*I(x+x'', y+y'')^2} = matchTemplate(I^2, W, method=2) sum{W(x'', y'')*2*I(x+x'', y+y'')*T(x'', y'')} = matchTemplate(I, 2*W*T, method=2) sum{W(x'', y'')*T(x'', y'')^2)} = matchTemplate(T^2, W, method=2) = sum(W*T^2)

El último elemento es una constante, por lo que, para minimizarlo, no tiene ningún efecto. Por otro lado, todavía podría ser útil ver si nuestra plantilla tiene una correspondencia perfecta (si Q se aproxima a cero). No obstante, para el último elemento, en realidad no necesitamos la función matchTemplate , ya que podría calcularse directamente.

El pseudocódigo final se ve así:

result = matchTemplate(I^2, W, method=2) - matchTemplate(I, 2*W*T, method=2) + as.scalar(sum(W*T^2))

¿Realmente hace exactamente como se define? Matemáticamente sí. Prácticamente, hay un pequeño error de redondeo, porque la función matchTemplate funciona en coma flotante de 32 bits, pero creo que no es un gran problema.

Tenga en cuenta que puede extender el análisis y tener equivalencias ponderadas para cualquier métrica ofrecida por matchTemplate .

Esto realmente funcionó para mí. Lo siento, no doy el código real. Estoy trabajando en R, así que no tengo el código en Python. Pero la idea es bastante simple.

Espero que esto sea de ayuda.


Imagemagick 7.0.3.9 ahora tiene una capacidad de comparación enmascarada para que pueda limitar la región de coincidencia de la plantilla. Ver http://www.imagemagick.org/discourse-server/viewtopic.php?f=4&t=31053

Además, veo que OpenCV 3.0 ahora tiene una coincidencia de plantilla enmascarada. Ver http://docs.opencv.org/3.0.0/df/dfb/group__imgproc__object.html#ga586ebfb0a7fb604b35a23d85391329be

Sin embargo, solo es para el método == CV_TM_SQDIFF y el método == CV_TM_CCORR_NORMED. ver python opencv matchTemplate es la característica de máscara implementada?


Lo que funcionó para mí la única vez que necesité esto fue llenar las áreas de "máscara" con ruido blanco. Luego se elimina efectivamente de la correlación cuando se buscan coincidencias. De lo contrario, obtuve, como supongo que lo hizo, coincidencias falsas en las áreas enmascaradas.


Una respuesta a tu pregunta es convolution . Usa la plantilla como kernel y filtra la imagen.

El Mat de destino tendrá áreas brillantes y densas donde podría estar su plantilla. Tendrás que agrupar los resultados (por ejemplo, cambio de media).

De esta forma, tendrá una implementación muy simple de la Transformada Hough Generalizada o una coincidencia de convolución basada en la Plantilla .