He encontrado una solución más elegante para esta pregunta. La función que usted necesita ya es proporcionada por OpenCV. Esto funciona en imágenes de color de 3 canales o en escala de grises de 1 canal: El método convertScaleAbs escala los elementos de la matriz, calcula los valores absolutos y convierte los resultados en enteros sin signo de 8 bits: dst (i) saturatecastabs (src (i) alfabeto) convertScaleAbs (InputArray src , OutputArray dst, double alpha1, double beta0) Ejemplo de código respondió Feb 8 15 at 23:46 Your Answer 2016 Stack Exchange, IncLa manera misteriosa de un promedio móvil hurones la tendencia de una masa de mediciones confusas se puede ver trazando el movimiento de 10 días Promedio junto con los pesos diarios originales, mostrados como pequeños diamantes. Los promedios móviles que usamos hasta ahora dan igual significación a todos los días en el promedio. Esto no es necesario. Si piensa en ello, no tiene mucho sentido, especialmente si está interesado en usar un promedio móvil a largo plazo para suavizar los golpes aleatorios en la tendencia. Supongamos que está utilizando una media móvil de 20 días. ¿Por qué debería su peso hace casi tres semanas ser considerado igualmente relevante para la tendencia actual como su peso esta mañana? Se han desarrollado varias formas de medias móviles ponderadas para abordar esta objeción. En lugar de simplemente sumar las mediciones para una secuencia de días y dividir por el número de días, en un promedio móvil ponderado cada medida se multiplica primero por un factor de peso que difiere de día a día. La suma final se divide, no por el número de días, sino por la suma de todos los factores de peso. Si se utilizan factores de peso mayores para los días más recientes y factores más pequeños para mediciones más atrás en el tiempo, la tendencia será más sensible a los cambios recientes sin sacrificar el suavizado que proporciona un promedio móvil. Un promedio móvil no ponderado es simplemente una media móvil ponderada con todos los factores de peso igual a 1. Puede utilizar cualquier factor de peso que le guste, pero un conjunto particular con el jawbreaking monicker Exponentially Smoothed Moving Average ha demostrado ser útil en aplicaciones que van desde radar de defensa aérea A la negociación del mercado de vientre de cerdo de Chicago. Vamos a ponerlo a trabajar en nuestros vientres también. Este gráfico compara los factores de peso para una media móvil movida exponencialmente de 20 días con una media móvil simple que pesa todos los días igualmente. El suavizado exponencial da a la medida de hoy dos veces la importancia que el promedio simple le asignaría, la medida de ayer un poco menos que eso y cada día sucesivo menos que su predecesor con el día 20 contribuyendo sólo 20 tanto al resultado como a una media móvil simple. Los factores de peso en una media móvil móvil suavizada exponencialmente son potencias sucesivas de un número llamado constante de suavizado. Un promedio móvil suavizado exponencialmente con una constante de suavizado de 1 es idéntico a un promedio móvil simple, ya que 1 a cualquier potencia es 1. Las constantes de suavización menores que 1 pesan los datos recientes más pesadamente, con el sesgo hacia las mediciones más recientes aumentando a medida que el suavizado La constante disminuye hacia cero. Si la constante de suavizado es superior a 1, los datos más antiguos se ponderan más intensamente que las mediciones recientes. Esta gráfica muestra los factores de peso que resultan de diferentes valores de la constante de suavizado. Observe cómo los factores de peso son todos 1 cuando la constante de suavizado es 1. Cuando la constante de suavizado está entre 0,5 y 0,9, el peso dado a los datos antiguos cae tan rápidamente comparado con mediciones más recientes que no hay necesidad de restringir la media móvil a Un número específico de días podemos hacer la media de todos los datos que tenemos, desde el principio y dejar que los factores de peso calculados a partir de la constante de suavizado descarten automáticamente los datos antiguos, ya que se vuelven irrelevantes para la tendencia actual. : Desenfocar imágenes con varios filtros paso bajo Aplicar filtros personalizados a imágenes (convolución 2D) Convolución 2D (Filtración de imágenes) En cuanto a las señales unidimensionales, las imágenes también pueden filtrarse con varios filtros de paso bajo (LPF), paso alto Filtros (HPF), etc. Un LPF ayuda a eliminar el ruido, o borrosa la imagen. Un filtro HPF ayuda a encontrar bordes en una imagen. OpenCV proporciona una función, cv2.filter2D (). Para convolver un kernel con una imagen. Como ejemplo, probaremos un filtro de promedio en una imagen. Un núcleo de filtro de 5x5 promediado puede definirse de la siguiente manera: Filtrar con el resultado del kernel anterior se realiza lo siguiente: para cada píxel, una ventana 5x5 está centrada en este píxel, se suman todos los píxeles que caen dentro de esta ventana y el resultado es Entonces dividido por 25. Esto equivale a calcular el promedio de los valores de píxel dentro de esa ventana. Esta operación se realiza para todos los píxeles en la imagen para producir la imagen filtrada de salida. Intente este código y compruebe el resultado: Blurring de la imagen (suavizado de la imagen) El blurring de la imagen se alcanza convirtiendo la imagen con un kernel del filtro del paso bajo. Es útil para eliminar el ruido. En realidad, elimina el contenido de alta frecuencia (por ejemplo, ruido, aristas) de la imagen, resultando en que los bordes queden borrosos cuando se aplica este filtro. (Bueno, hay técnicas borrosas que no borran los bordes). OpenCV proporciona principalmente cuatro tipos de técnicas de borrosidad. 1. Promedio Esto se hace convolucionando la imagen con un filtro de cuadro normalizado. Simplemente toma el promedio de todos los píxeles bajo el área del kernel y reemplaza al elemento central por este promedio. Esto se hace mediante la función cv2.blur () o cv2.boxFilter (). Compruebe los documentos para obtener más detalles sobre el kernel. Deberíamos especificar el ancho y la altura del kernel. Un filtro de caja normalizado de 3x3 se vería así: Si no desea utilizar un filtro de cuadro normalizado, utilice cv2.boxFilter () y pase el argumento normalizeFalse a la función. 2. Filtro Gaussiano En este enfoque, en lugar de un filtro de caja que consta de coeficientes de filtro iguales, se utiliza un núcleo Gaussiano. Se hace con la función, cv2.GaussianBlur (). Deberíamos especificar el ancho y la altura del núcleo que debe ser positivo y impar. También deberíamos especificar la desviación estándar en las direcciones X e Y, sigmaX y sigmaY, respectivamente. Si sólo se especifica sigmaX, sigmaY se toma como igual a sigmaX. Si ambos se dan como ceros, se calculan a partir del tamaño del núcleo. El filtrado gaussiano es muy eficaz para eliminar el ruido gaussiano de la imagen. Si lo desea, puede crear un kernel gaussiano con la función cv2.getGaussianKernel (). 3. Median Filtering Aquí, la función cv2.medianBlur () calcula la mediana de todos los pixels bajo la ventana del kernel y el píxel central se reemplaza con este valor mediano. Esto es muy eficaz para eliminar el ruido de sal y pimienta. Una cosa interesante a notar es que, en los filtros gaussianos y de caja, el valor filtrado para el elemento central puede ser un valor que puede no existir en la imagen original. Sin embargo, este no es el caso en el filtrado mediano, ya que el elemento central siempre se reemplaza por algún valor de píxel en la imagen. Esto reduce el ruido de manera efectiva. El tamaño del kernel debe ser un número entero impar positivo. En esta demo, añadimos un ruido de 50 a nuestra imagen original y usamos un filtro mediano. Comprobación del resultado: 4. Filtración Bilateral Como se observó, los filtros que presentamos anteriormente tienden a desenfocar los bordes. Este no es el caso para el filtro bilateral, cv2.bilateralFilter (). Que se definió para, y es altamente eficaz en la eliminación del ruido mientras que preserva bordes. Pero la operación es más lenta en comparación con otros filtros. Ya vimos que un filtro gaussiano toma el barrio alrededor del píxel y encuentra su promedio ponderado gaussiano. Este filtro gaussiano es una función del espacio solo, es decir, los píxeles cercanos se consideran mientras se filtran. No considera si los píxeles tienen casi el mismo valor de intensidad y no considera si el píxel se encuentra en un borde o no. El efecto resultante es que los filtros gaussianos tienden a desenfocar los bordes, lo cual es indeseable. El filtro bilateral también utiliza un filtro gaussiano en el dominio espacial, pero también utiliza un componente (multiplicativo) de filtro gaussiano adicional que es una función de las diferencias de intensidad de píxeles. La función gaussiana del espacio asegura que sólo los píxeles son vecinos 8217, 8217 son considerados para filtrar, mientras que el componente gaussiano aplicado en el dominio de intensidad (una función gaussiana de diferencias de intensidad) asegura que sólo aquellos píxeles con intensidades similares a la del píxel central 8216, vecinos de intensidad 8217) para calcular el valor de intensidad borrosa. Como resultado, este método conserva los bordes, ya que para píxeles situados cerca de los bordes, los pixels vecinos situados en el otro lado del borde, y por lo tanto exhibiendo grandes variaciones de intensidad en comparación con el píxel central, no se incluirán para el desenfoque. El ejemplo siguiente demuestra el uso del filtrado bilateral (para obtener detalles sobre los argumentos, consulte los documentos de OpenCV). Tenga en cuenta que la textura de la superficie se ha ido, pero los bordes todavía se conservan.
No comments:
Post a Comment